字符处理的两个问题:
处理字符是C语言中的常见操作,有两个问题需要讨论:一是判断字符处理结束的标志是空字符还是换行符,二是循环处理字符时,循环次数是字符数组的容量大小还是实际输入字符的个数。
举例: 键盘输入一行字符,统计大写字符的个数。
本例可用两种方法编程,第一种方法的代码如下:
#include <stdio.h>
int main()
{char c;
int n = 0;
while((c = getchar()) != ‘\n’) //遇到换行符停止循环
if(c >= 65 && c <= 90)
n++;
printf(“%d\n”, n);
return 0;
}
下面是第二种方法:
#include <stdio.h>
int main()
{char s[80];
int i, n = 0;
gets(s);
for(i = 0; s[i] != ‘\0’; i++) //空字符作为结束标志
if(s[i] >= 65 && s[i] <= 90)
n++;
printf(“%d\n”, n);
return 0;
}
两个程序都可正常运行得到正确的结果。
1:结束标志用空字符还是换行符?
这是因为,我们键入的字符串,在敲回车键时被送入键盘缓冲区,回车键被转换成了换行符‘\n’一同送入了缓冲区。第一种方法用的是函数getchar(),它是从缓冲区取字符(而不是从字符数组中),因此碰到换行符就应该结束。而第二种方法中先用了函数gets(),该函数从缓冲区中取回一个字符串(一直取到换行符为止),然后将字符串存到指定的位置(字符数组s中),而在存字符串的时候,会在最后多写一个空字符‘\0’。程序后面的循环部分,我们是判断数组元素中的字符(而不是缓冲区中的字符),因此应以空字符为结束标志。
字符串从键盘输入到键盘缓冲区直至存入数组的过程:
键盘输入 缓冲区中内容 数组内容
abc<Enter> ‘a’、 ‘b’、 ‘c’、 ‘\n’ ‘a’、 ‘b’、 ‘c’、 ‘\0’
由此可知:判断数组中的字符时,循环应以空字符为结束标志,而从缓冲区取字符判断时,应以换行符为结束标志。
2:循环次数是数组大小还是实际字符个数?
第二段程序中的循环,可不可以写成下面的方式?
for(i = 0; i < 80; i++)
if(s[i] >= 65 && s[i] <= 90)
n++;
答案是不可以。因为80只是字符数组的最大容量,用户在键盘输入时,输入的字符个数可以少于80,因此不能对数组中的80个元素都进行判断,而是只判断其中的有效字符。
可以用下面的方法:
for(i = 0; i < strlen(s); i++)
if(s[i] >= 65 && s[i] <= 90)
n++;
但这种方法需要包含头文件string.h,较麻烦,而且代码效率较低。