从Hello World得到教训
想做一些ACM试题,就从第一道题开始了,每一门语言的开篇,Hello World!没错就是它啦。
试题如下
题目很简单啦,就是输入一行数字,然后输出其对应的字符便好。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input;
while((scanf("%c", &input)) != EOF)
{
printf("%c", input);
}
return 0;
}
很快写出了一个来,运行结果如下:
72 101 108 108 111 44 Enter
72 101 108 108 111 44
缘何如此,%c不就是输出字符吗?是的,没有问题,%c是输出的字符啊。
换一种方法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int input;
while((intput = getchar()) != EOF)
{
printf("%c", input);
}
return 0;
}
执行结果:
72 101 108 108 111 44 Enter
72 101 108 108 111 44
结果依旧,问题在何处?
再换一种方式:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int input;
while((scanf("%d", &input)) != EOF)
{
printf("%c", input);
}
return 0;
}
执行结果:
72 101 108 108 111 44 Enter
Hello,
这下对了,问题何在?
原来问题出在了getchar() 与scanf()上了,计算机是最规矩的了,完全按照人的命令去执行,一点不偷懒,错了,那就是人自己偷懒了。
不论第一个和第二个解决方案,都是按照字符的形式来输入,也即从屏幕上读取一个字符,很明显,读取一个字符就是‘7’,将它再输出,结果肯定还是输出7喽。没有问题啊。计算机很规矩啊,按照你说的做啊。问题在于你没有理解这个命令行输入的关键:
字符串读取到换行符,空格,tab等分隔符停止。字符则单单读取一个字符,你输入的72是两个字符,它是不会被一次读进来的。要想被一下子读进来,使用一个整数读取,读取到一个空格,tab或换行符为止,然后转化为integer。这样输出时才能将72作为ASCII输出一个字符。
治学要严谨,学习要认真,以此为戒,努力加油。
By Andy 2012-11-18