您的位置:首页 > 其它

第二篇blog 关于回车键读入字符的处理

2014-05-24 23:20 176 查看
今天下午午睡起来就出去买回家的车票,回来的路上有人向我发消息问C语言的问题,回寝室之后就和他一直讨论,感觉收获很多。

这个家伙是前半个月在C语言交流群里认识的,那时候他发求助信息,我就帮他讲。其实那一次我看程序也看了半天才弄懂,让他等了半天,还记得是一个求两个数之间素数的函数问题,交流讲解过后我自己也觉得获益匪浅,他也和我一样是大一的学生,我感觉这个家伙也和我一样是对编程很有兴趣的人,所以聊得挺开心。

今天他给我的一个题是关于用一个字符(而不是数组或者字符串)对一串字符串加密的程序,程序很简单,但我看到的细看还是眼前一亮,这应该是他自己的思想,他说困扰了他很久了,下面把代码贴出来:

#include<stdio.h>

void main()

{

char a;

while(a!='\n')

{

a=getchar();

putchar(a+1);

}

printf("\n");

}

他的困扰就在于在每次输入一串字符串之后就在于每次输入一串字符串之后会输出一个多的未知字符,他认为错误就在于while循环的控制语句。 我把程序用vc测试了一下,的确会有多的字符输出。 我看第一眼控制语句说实在的没有看懂,为什么会空\n来做控制语句。后来他告诉我\n是回车键的对应字符,我顿时糊涂了,回车键有对应字符? 我把判断语句改为\0,\r 试数过后,我发觉这个的却是回车字符这里出了问题。我再看循环内部,发现原来内部存在问题。a=getchar();之后就紧接着putchar(a+1);
这样就会把刚才接收到的字符加密输出,但是这个加密在本该判断本次循环的判断条件之前执行,所以我就把程序改好发给他:

#include<stdio.h>

void main()

{

char a = '\0';

while(a!='\n')

{

if(a != '\0')

putchar(a+1);

a=getchar();

}

printf("\n");

我仅仅只是给函数赋了初值,然后把输出放在接收之前,这样就变成了a接收到字符之后就是判断,再输出了,可以避免判断出错。

但是后来他有问我为什么会输出那个多余的字符。是不是判断语句其实是一个废语句,根本可以不需要特殊判断句就可以运行程序。

这个问题我其实也没想好,因为按理来说回车键只是执行命令,而应该没有字符输出的。

后来我做出的总结就是:

回车键的确是执行命令,而对应在这个程序的思路是:首先,为它赋初值空,然后进入循环,因为空+1过后还是会有一个对应的字符,所以用if让它在为空时不输出,然后从控制台得到一个字符,然后开始循环,最后a存储的是回车的字符‘\n’,用判断句让它退出循环。这个程序是靠回车键开始运行,它运行之后会从控制台的缓冲区间读字符,因为在按下



时也在缓冲区间留下了一个回车键的字符\n,所以最后读入程序的也应该是\n,所以加密过后会出现一个字符。

所以对回车键字符在程序中也该有特殊的处理,这个家伙也算是误打误撞找到了处理回车字符的方法。不过对回车键字符的处理换到其它地方也要有别的方法:

比如baidu一位网友问的问题,说得非常好:

[html] view
plaincopy

<span style="font-size:12px;">scanf("%c",&a); // 向a输入一个字符

gets(b); //向b输入一个字符串

gets(c); //向c输入一个字符串

当我输入一个字符到a后,回车

怎么会直接跳到输入字符串c

我调试看了下,它会自动在a输入完后,向b输入字符'\0'

这是为什么了??</span>

原因就是,开始的时候输入了两个字符,回车符触发了程序的运行,当程序读完第一个字符后,就把第一个字符赋值给了 scanf函数,接着那个回车符就被gets(b)读去了,再接着缓冲区空了,这是就自然又要用户从输入流中输入字符并以回车结束。

getchar函数和scanf函数一样。

目前我知道的解决的办法有两个:
1 可以在这两个函数后面 加一个读取那个回车符的函数,getchar();
2 如果是scanf()函数可以 直接写读入回车符 scanf("%c\n",&a);主要是添加 格式字符串后面的那个 \n。至于原理现在我还说不太清,但感觉可能是 两个换行符同时出现所以编译器自动消掉了一个吧。此问题还在探索中。。。
引用了这个网友的处理方法也可以处理。


后来我也讨论了学习程序的方法,我们对程序的方法也有一些不约而同,一般不会去问人,而是自己调试程序自己想,对一个程序会不停的改,这里加一句,那里该一句,去弄懂每一个语句的使用方法和作用,当我们编完一个程序之后也对程序几乎全部弄懂,和别人讨论时也能碰撞出火花。11点多了,写的有一个多小时,挺累的了,可以休息了,虽然写的有些言不达意
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: