字符串处理的两个问题

字符处理的两个问题:

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

转自http://blog.csdn.net/Joycecsdn/article/details/41687307


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值