从Hello World得到教训

本文通过一道ACM试题讲述了在处理字符输入时遇到的问题,指出使用`getchar()`或`scanf("%c")`会按字符读取,而`scanf("%d")`会读取到空格、换行符等分隔符为止,从而导致不同结果。作者强调了编程中严谨治学和认真学习的重要性。
摘要由CSDN通过智能技术生成

从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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值