C:printf()和putchar()问题

时间:2013-06-24 10:12:39

标签: c input printf user-input putchar

我正在阅读K& R书,想要以我从未尝试过的方式测试printf()和putchar()函数。我遇到了一些意想不到的事件,并希望听到更有经验的程序员为什么会这样。

char c;
while((c = getchar()) != EOF) {
//put char(c);
    printf("%d your character was.\n", c);
}
  1. 如何在输入流(getchar()或scanf()函数中获得EOF(文件结尾))? getchar()/ scanf()函数无法识别的意外密钥可以产生吗?
  2. 在我的书中,它说c必须是一个整数,因为它需要存储EOF并且变量必须足够大以容纳EOF可以容纳的任何可能的char。这对我来说没有意义,因为EOF是一个值为-1的常量整数,偶数char可以存储。任何人都可以澄清这是什么意思吗?
  3. 当我向putchar()函数发送“hello”或“hello”时会发生什么?它期望得到一个整数,但如果我发送后一个字符串或字符序列,则会返回奇怪的输出,例如 EE oo
  4. 为什么当我使用上面写的printf()函数时,我得到两个输出?一个是我输入的,另一个是整数,在ASCII中是行尾。它是否产生第二个输出,因为我按下回车键,它假定它是第二个字符?
  5. 感谢。

2 个答案:

答案 0 :(得分:4)

    在Linux上
  1. ,您可以使用Ctrl + d

  2. 发送它
  3. 你需要一个int,否则你无法区分EOF和最后一个可能的字符(0xFFFF与0x00FF不同)

  4. putchar想要一个字符,而不是字符串,如果你想给它一个字符串,它会打印字符串地址的一部分

  5. 您只获得一个输出:您输入的字符的ascii值,另一个“输入”是您在终端输入的内容

  6. 编辑 - 有关2

    的详细信息

    你需要一个int,因为getchar可以返回值为-1(0x00FF)的字符和值为-1的整数(0xFFFF),它们的含义不同:值-1的字符是有效字符(例如,它在拉丁语1中是ÿ)而值-1的整数在此上下文中是EOF。

    这是一个显示差异的简单程序:

    #include <stdio.h>
    
    int main(int argc, char ** argv) {
        {
            char c = 0xFF; /* this is a valid char */
            if (c == EOF) printf("wrong end of file detection\n");
        }
        {
            int c = 0xFF; /* this is a valid char */
            if (c == EOF) printf("wrong end of file detection\n");
        }
    }
    

    第一次测试成功,因为char为0xFF == -1,而第二次测试失败,因为int为0x00FF!= -1。

    我希望这会让它更清晰。

答案 1 :(得分:0)

  1. 您必须关闭输入流才能获得EOF。通常在UNIX中使用CTRL-D,但是请参见tty config(stty -a)
  2. 已经回答了
  3. 相同
  4. 您的tty默认回显您键入的内容。如果您不想这样,请将其设置为noecho模式(stty -echo)。一些炮弹再次让它回响起来。试着用sh。您必须知道taht tty还会缓冲输入,直到RETURN类型为止(如果需要,请参阅原始模式的stty手册)。