字符串输入问题
字符串输入函数:
- scanf(“%s”, str) 读入一串字符,以
空格、回车、制表符或EOF
为分隔符号,空格、回车、制表符或EOF不会被读入。分隔符号后的字符将作为下一输入项处理。 - gets(str) 读入一行字符,以
回车或EOF
为分隔符号,回车或EOF不会被读入。
不能使用赋值语句
将一个字符串常量
或字符数组
直接赋给一个字符数组
。字符数组名是一个地址常量,它不能改变值,正如数值型数组名不能被赋值一样。如下面两行都是不合法的:
str1 = "China";
str2 = str1;
用赋值语句
只能将一个字符
赋给一个字符型变量
或字符数组元素
。所以快捷的实现方法是使用strcpy函数
将一个字符串复制
到另一个字符数组中去。
字符串复制函数:strcpy(str1, str2) 把字符串str2复制到字符数组str1中去(包括’\0’)。 字符串str2的位置也可以是一个字符串常量
。若str2有效字符
位数 <= str1,则会部分或完全覆盖
。若str2有效字符位数 > str1,则会报错。
字符串指定位复制函数:strncpy(str1, str2, n) 将字符串str2中前面n个
字符复制到字符数组str1中去,取代
str1中原有的最前面n个
字符。
字符串长度问题
我们在对字符数组进行初始化时,从中括号
里写不写数字
来看有两种写法:
- 中括号写数字
A. 数字与实际大小相等:系统不会在后面加'\0'
,字符个数等于数组大小等于数字。
B. 数字与实际大小不等:系统会对char str[6] = "abc123"; char str[6] = { "abc123"}; char str[6] = { 'a', 'b', 'c', '1', '2', '3'};
未初始化元素置'\0'
,字符个数与数字不等,数组大小与数字相等。char str[8] = "abc123"; //"abc123\0\0" char str[8] = { "abc123"}; //{"abc123\0\0"} char str[8] = { 'a', 'b', 'c', '1', '2', '3'}; //{'a','b','c','1','2','3','\0','\0'}
- 中括号不写数字:下面的前两种情况系统会
自动在末尾加'\0'
,此时数组大小等于字符个数加一
。第三种情况则不同
,数组长度等于字符个数。char str[] = "abc123"; //"abc123\0" char str[] = { "abc123" }; //{"abc123\0"} char str[] = { 'a', 'b', 'c', '1', '2', '3' }; //故采用该方法定义时,我们一般手动加上'\0',如下: //char str[] = { 'a', 'b', 'c', '1', '2', '3', '\0' };
而我们一般认为的字符串长度,指的是字符数组的有效字符个数,所以不包括 ‘\0’。
故而使用sizeof()
计算的字符数组长度
是不能用来当做字符串长度
的,所以我们通常使用strlen()函数
。strlen()函数
通过'\0'
来判断字符串结束位置,并返回字符串的有效字符个数
,计算出字符串长度
。
其他字符串函数
字符串拼接函数:strcat(str1, str2)
把字符串str2拼接
到字符串str1的后面
(包括'\0'
),结果放在str1字符数组中,故而必须保证str1数组大小满足要求。函数调用后得到的返回值
是str1字符数组的地址
。
字符串比较函数:strcmp(str1, str2)
用来比较
str1和str2,比较规则是将两个字符串自左至右
逐个字符按ASCII码
值大小比较,直到出现不同的字符
或遇到'\0'
为止。其实这个函数使用时我们更关心它是否相等
的结果,如果全部字符
相同,则认为两个字符串相等。反而并不关心谁比谁大,字符串比大小没什么意义。
- 若两个字符串相同,返回0。
- 若str1>str2,返回一个正整数。
- 若str1<str2,返回一个负整数。
字符串大小写转换函数
- strlwr():将字符串中的
大写
字母转换为小写
字母。 - strupr():将字符串中的
小写
字母转换为大写
字母。