为什么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()
将一个字符写入标准输出。
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 中字符的一部分)。
刚开始使用 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()
将一个字符写入标准输出。
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 中字符的一部分)。