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

Why does getchar let single-character output functions display strings?

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

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

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

cacti
cacti
stop repeating what i'm saying
stop repeating what i'm saying

就这样。

我不明白的是为什么我不能用一串文本实例化变量 c 并以相同的方式打印它。 (为了示例而忽略 while 循环)就像:

main()
{
    int c;

    c = "cacti";
    putchar(c);
}

其中输出显然只是 'd'

这里的c只是一个整数,它取一个适合你的情况的字符(虽然它的限制比那个大)。

第一个代码段:

  • getchar() 仅 return 一个字符,您使用 while 循环从流中获取一个字符并通过 putchar() 它打印到控制台直到文件结束。你似乎得到一行字符串并打印它但它不是那样做的。

在第二个代码段中:

  • 您将 const char* 设置为无效的整数(我的 gcc 4.9.2 无法编译)。所以它显示未定义的字符(为什么打印 'd' 我不知道,可能是编译器问题)。

您可以通过以下方式完成此操作:

main()
{
    char c[] = "cacti";
    puts(c);
}

编辑 根据getchar()定义:

On success, the character read is returned (promoted to an int value). The return type is int to accommodate for the special value EOF, which indicates failure.

当您键入一行并按回车键时,第一个字符会在 while 循环之外读取。比检查它是否是 EOF(文件结尾 - 文件上没有更多数据。您可以通过在 windows 中按 Ctrl+Z 和在 linux 中按 Ctrl+D 来提供 EOF)。

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

所以它与 puts() 混淆,后者在标准输出中写入字符串。 其中 putchar() 将一个字符写入标准输出。

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

Writes the C string pointed by str to the standard output (stdout) and appends a newline character ('\n').

您可以使用面向行的输入函数来读取整行。例如:

#include <stdio.h>

int main(void)
{
    char line[4096];
    while (fgets(line, sizeof(line), stdin) != 0)
        fputs(line, stdout);
    return 0;
}

对于大多数似是而非的文件,这将一次读入一行字符数组,然后写出该行。 (如果行长超过 4095 个字符,那么行将被分成多个段处理。)如果文件包含空字节,那么从空字节到行尾的 material 将被忽略。有一些修复——参见标准 C 函数 fread() and fwrite() 和 POSIX 函数 getline().


注意你的第二个例子:

int main(void)
{
    int c;

    c = "cacti";
    putchar(c);
}

不应该在没有关于将字符指针分配给整数的警告的情况下进行编译。当您在结果上使用 putchar() 时,它可能会打印存储字符串 "cacti" 的地址的最低有效字节。纯属巧合,打印出来的字符是d.

putchar() 函数只打印单个字节(在许多代码集中这意味着单个字符,但它可能只是 UTF-8 中字符的一部分)。