为什么getchar允许单字符输出函数显示字符串?

Jaw*_*Mmm 1 c character getchar

刚开始使用K&R并点击:

#include <stdio.h>
/* copy input to output; 1st version */
main()
{
    int c;
    c = getchar();
    while (c != EOF) {
        putchar(c);
        c = getchar();
    }
}
Run Code Online (Sandbox Code Playgroud)

它只显示我输入的内容,即使它是一串文本.

cacti
cacti
stop repeating what i'm saying
stop repeating what i'm saying
Run Code Online (Sandbox Code Playgroud)

就像那样.

我没有得到的是为什么我不能用一串文本实例化变量c并以相同的方式打印它.(为了示例而忽略while循环)与:

main()
{
    int c;

    c = "cacti";
    putchar(c);
}
Run Code Online (Sandbox Code Playgroud)

其中输出显然只是'd'

ash*_*n33 5

这里c只是一个整数,它为你的情况取一个字符(虽然它的限制大于那个).

对于第一个代码段:

  • getchar()只返回一个字符并使用while循环从流中取出一个字符并通过putchar()它打印到控制台直到文件结尾.你似乎得到了一行字符串并打印它,但它没有这样做.

在第二个代码段:

  • 你把一个const char*放到了无效的整数(我的gcc 4.9.2不能编译).所以它显示未定义的字符(为什么打印'd'我不知道,可能是编译器问题).

你可以这样做:

main()
{
    char c[] = "cacti";
    puts(c);
}
Run Code Online (Sandbox Code Playgroud)

编辑 根据 getchar()定义:

成功时,返回字符读取(提升为int值).返回类型为int以适应特殊值EOF,表示失败.

键入单行并按Enter键,然后在while循环外读取第一个字符.然后检查它是否是EOF(文件结束 - 文件中没有更多数据.您可以通过在Windows中按Ctrl + Z和在Linux中按Ctrl + D来提供EOF).

好像它没有遇到EOF,然后它进入while循环并打印单个字符(by putchar(c)).在下一行之后c=getchar(),在前一行中输入另一个字符并检查while循环条件while(c!=EOF)是否为真,它进入循环并打印一个字符.它一直持续到发现任何要打印的字符为止.

所以它会使puts()混淆,它在标准输出中写入一个字符串.Where putchar()将字符写入标准输出.

根据http://www.cplusplus.com/

将str指向的C字符串写入标准输出(stdout)并附加换行符('\n').