C语言 字符处理的两个问题

字符处理的两个问题:

处理字符是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,较麻烦,而且代码效率较低。


你可能感兴趣的:(C语言,字符处理的两个问题)