C++中一些较模糊的知识

这些呢是我后来在整理大一时候学的 C++ 课件的时候,发现有的地方我还不是很掌握,就索性把这些给记了下来,没事就看一下。

 

目录

1、gets 函数

2、puts 函数

3、windows.h 库函数

4、iomanip 库函数

5、string.h 库函数

6、字符数组的一些漏点

7、变量的存储类别

8、一个逻辑表达式的短路运算


 

1、gets 函数

gets 函数 :输入字符串的函数。一般形式为 gets(字符数组) ,其作用是从终端输入一个字符串到字符数组,并且得到一个函数值,该函数值是字符数组的起始地址。如:

char str[20] ;
gets(str) ;

与 cin 、scanf 相比,gets() 可以接受包含空格的字符串,cin 等不能 (可以去试试),但它们两个都是以 '\n' 作为输入结束的标志。另外有个 getchar() 函数,其作用是从终端输入一个字符。 

 

2、puts 函数

puts 函数:输出字符串的函数。一般形式为 puts(字符数组) ,其作用是将一个字符串(以 '\0' 结束的字符序列 )输出到终端,并用换行符 '\n' 替换 '\0' 。如:

char str[10]="China" ;
puts(str) ;

另外,puts 函数输出的字符串可以包括转义字符。例:

char str[20]="China\nHello" ;
puts(str) ;

同样有个 putchar() 函数,其作用是从计算机向显示器输出一个字符。虽然和上面 puts 、gets 函数有点类似,只是 putchar()、getchar () 函数一次仅能输入或输出一个字符

 

3、windows.h 库函数

这个我在 c 语言中还真没怎么用过,老师也只是随口提了一句,写了一个 SetConsoleTitle 函数,感觉有点意思,然后我就去查了查其他方面的函数,翻了不少,认为这位博主写的不错,链接:一共三篇,剩下两篇通过他主页去看 。但没看到我上面那个函数,那我就在这里补充一下:

SetConsoleTitle 函数是设置控制台标题的(就是运行的那个小黑窗口上方的标题),语法也很简单,看:

SetConsoleTitle("-_-!");

不过需要切记的是,别忘了加头文件 (#include windows.h) 。

 

4、iomanip 库函数

这个也是老师提了几句,详情看百度百科吧:百度一下,你就知道 。

 

5、string.h 库函数

这个还是经常使用的,里边有的函数对字符串进行某些要求的实现还是很合适的,具体情况我看了看,百度上还是说的很详细(糗...):百度百科 。不过我这里再多少补充一下:

strcat 字符连接函数,其形式为 strcat(字符数组1,字符数组2),将字符串2接到字符串1后面,结果放到字符数组1中(字符数组1要足够大,以避免越界错误)。

strcmp 字符串比较函数,比较规则是:将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到 '\0' 为止;如全部字符相同,认为两个字符相等,若出现不相同的字符,则以第一对不相同的的字符的比较结果为准,比较的是 ASCII 码值的大小。另外需注意:

//下面的比较是不对的
if(str1>str2)
    cout<<"yes" <<endl;
//正确的应该是
if(strcmp(str1,str2)>0)
    cout << "yes" <<endl;

strcpy 复制函数,其形式为 strcpy(字符数组1,字符串2),将字符串2复制到字符数组1中去。字符数组1必须定义足够大,以便容纳被复制的字符串,起码字符数组1不应小于字符串2的长度;字符数组1必须写成数组名形式(如str),字符串2可以是字符数组名,也可以是一个字符串(如 strcpy(str,"China") );复制的时候连同字符串后面的 '\0' 一起复制到字符数组1中去。另外可以用 strncpy 函数将字符串2 中前 n 个字符复制到字符数组1中去,即 strncpy(str1,str2,n) ,将 str2 中最前面的n个字符复制到 str1 中去,取代 str1 中原有的前 n 个字符。

strlwr 转换函数,其形式为 strlwr (字符串),是将字符串中大写字母换成小写字母的。

 

6、字符数组的一些漏点

这部分是之前学习的时候没怎么注意,到现在记得也不是很清楚了,就重申一下:

用字符串(双引号) 给字符数组初始化,最后自动添加 '\0' ,如果指定长度,要考虑空字符,要比实际初始化的长度的长度大1,用于存放空字符 '\0' 。如:

char a[] = {"I am happy"} ;

//可写成
char a[] = "I am happy" ;

//相当于
char a[11] = {"I am happy"} ;

字符数组本身并不要求它的最后一个字符为 '\0' ,甚至可以不包含 '\0' : char a[5] = {'C' ,'h' , 'i' , 'n' , 'a' } ; 但是由于系统对字符串常量自动加一个 '\0' ,因此,为了使处理方法一致,在用字符数组来刻画字符串时,也常人为地加上一个 '\0' 。

在 c 语言中,是将字符串作为字符数组来处理的,字符串是以 '\0' 结尾的字符数组。在实际应用中,关心的是字符串的有效长度而不是字符数组的长度;为了测定字符串的实际长度,c 语言便规定了字符串结束标志 '\0'

'\0' 代表 ASCII 码为 0 的字符 ,从 ASCII 码表可以看出,ASCII 码为 0 的字符不是一个可以显示的字符,而是一个 “空操作符” 即它什么也不做。用它作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。

下面列一些数组初始化的例子,有点东西:

//正常赋值 
int x[3] = {2,4,6} ;
double y [2][3] = {1,3,5,2,4,6} ;

int x1[] = {2,4,6} ;	//一维数组省略下标个数,将根据初始值数量把下标个数设为3 
double y1[][3] = {1,3,5,2,4,6} ;	//多维数组只能省略第一个下标个数
								//将根据初始值数量把行下标个数设为2(6%3=2) 
	
	
int x2[3] = {2,4} ;	//前两个元素的初始值依次设为 2, 4 
				//最后一个元素没有给初始值,自动设为0 
double y2[2][3] = {{1,3},{2,4}} ;	//每一行的最后一个元素没有给初始值,自动设为0 
double y3[2][3] = {{1,3,5}}; 	//将第0行3个元素的初始值依次设为 1,3,5
							//第一行没有给初始值,三个元素都自动设为0 

另外多说一点:当数组元素作为函数的参数时,同一般变量;而用数组名作为函数参数时,向被调函数传递的是数组首元素的地址(数组名就是数组首地址)

 

7、变量的存储类别

1)、从作用域角度分,有局部变量和全局变量。2)从变量存在的时间来区分,有动态存储和静态存储两种类型;静态存储是程序整个运行期间都存在,动态存储则是在调用函数时临时分配单元。3)、从变量值存放的位置来区分,可分为:内存中静态存储区(静态局部变量,静态外部变量,外部变量),内存中动态存储区(自动变量和形式参数)以及 CPU 中的寄存器(寄存器变量)。

静态局部变量(static类别)属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放。自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值,以后每次调用函数时不再重新赋初值,而只是保留上次函数调用结束时的值。如果定义局部变量时不赋初值的话,则对静态局部标量来说,编译时自动赋初值 0 (对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它

 

8、一个逻辑表达式的短路运算

有这样一个例子: (m=a>b) && (n=c>d) ,当 a=1 , b=2 , c=3 , d=4 时, m 和 n 的原值为 1 时,表达式执行完后 m 和 n 各为几?

解答:

由于 a>b 的值为 0 ,因此 m=0 。而 "n=c>d " 不被执行,因此 n 的值不是 0 而仍保持原值 1 。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值