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

原创 2014年12月02日 23:55:52

字符处理的两个问题:

处理字符是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语言:用getchar函数读入两个字符给c1,c2,用putchar和printf输出。思考问题

用getchar函数读入两个字符给c1,c2,分别用putchar和printf输出这两个字符。思考以下问题:(1)变量c1和c2定义为字符型还是整型?或二者皆可?(2)要求输出c1和c2的ASCII...

C语言强化(七)链表相交问题_4 判断两个有环链表是否相交

上一节结束后,我们已经可以判断链表是否有环了,如果无环,那么按照前两节所讲的方法去判断链表是否相交以及获取相交结点,如果有环呢?怎么判断是否相交?...

菜鸟在C语言编译,链接时可能遇到的两个问题

转载:http://www.cnblogs.com/Jack47/p/multiply-defined-global-symbols-static-libraries-resolve-referenc...
  • lin_FS
  • lin_FS
  • 2016年11月28日 17:27
  • 395

C语言强化(七)链表相交问题_5 找到两个有环链表的相交结点

有环链表是否相交我们也可以判断了,剩下的就是获得有环链表相交结点

菜鸟在C语言编译,链接时可能遇到的两个问题

菜鸟在C语言编译,链接时可能遇到的两个问题 最近在看 CSAPP (Computer Systems A Programmers Perspective 2nd) 的第七章 链接。学到了点东...

c语言算法—背包问题进阶型(含有两个约束项)

在之前的01背包问题中,我们可以发现约束项都只有一个,下面我们来探讨两个约束项的情况;首先,我们考虑使用一维还是二维来表达:在有一个约束项时,我们需要二维,因为横向表示物品数,而竖向表示约束项的改变;...

C语言中以十六进制输出字符型变量会出现'ffffff"的问题

http://guhanjie.iteye.com/blog/1765585 最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符...

c语言里面用scanf连续输入字符型数据常见问题

#include #include int main() { char i,j; printf("put in i:"); scanf("%c",&i); prin...

C语言空白字符读取问题

当我们读取字符或者字符串时,有时会遇到烦人的空白字符问题。因为结果很奇怪,为什么明明程序看起来没有错,但是结果读取到的值却是空的呢?下面我们来仔细分析一下。...

c语言scanf()停止接受输入及scanf("%c",&c)吃掉回车或者空格字符的问题

scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。          ① 遇空格、“回车”、“跳格...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言 字符处理的两个问题
举报原因:
原因补充:

(最多只允许输入30个字)