你的代码是这样的(除了我添加了一堆空格来提高它的可读性):
1 #include <stdio.h>
2 void main()
3 {
4 char a[10], c;
5 int i = 0;
6 while ((c = getchar()) != '\n')
7 {
8 scanf("%c", &a[i++]);
9 c = getchar();
10 }
11 for (i = 0; i < 11; i++)
12 printf("%c", a[i]);
13 }
逐行分析:
- 好的(现在我在
#include
和之间添加了空格<stdio.h>
)。
- 该
main()
函数返回一个int
.
- 好的(很难弄错开放式大括号)。
- 由于返回值为
getchar()
an int
,需要c
单独声明为 an int
。
- 好的。
- 需要考虑EOF;应该是
while ((c = getchar()) != EOF && c != '\n')
。不过,您仍然很容易受到缓冲区溢出的影响。
- 好的。
- 不好。这从标准输入读取另一个字符,并且不检查 EOF。
- 不好。这也从标准输入中读取另一个字符。但是当你回到循环的顶部时,你读到了另一个字符。因此,就目前情况而言,如果您
abcdefg
在程序中键入,c
则'a'
在循环控制中被赋值,然后被a[0]
赋值'b'
,然后c
被赋值'c'
,然后循环以a[1]
get重复'e'
。如果我输入了 6 个字符加上换行符,循环将完全终止。因为我声称我输入了 7 个字符,所以第三次迭代分配'g'
给c
,它不是换行符,所以获取换行符,并且程序在循环结束时a[2]
等待更多输入和语句。c = getchar();
- 好的(同上大括号)。
- 不好。您没有考虑循环的提前终止,并且您无条件地访问
a[10]
数组的一个不存在的元素a
(它只有元素 0..9 - C 不是 BASIC!)。
- 好的。
- 您可能需要在
for
循环后输出换行符。你应该return 0;
在main()
.
因为您的输入缓冲区很短,所以最好编写一个长度检查。如果您使用过char a[4096];
,我可能不会打扰您(尽管即便如此,缓冲区溢出的风险很小,可能会带来不良后果)。所有这些导致:
#include <stdio.h>
int main(void)
{
char a[10];
int c;
int i;
int n;
for (i = 0; i < sizeof(a) && ((c=getchar()) != EOF && c != '\n')
a[i++] = c;
n = i;
for (i = 0; i < n; i++)
printf("%c", a[i]);
putchar('\n');
return 0;
}
请注意,原始代码和修改后的代码都不会终止字符串。对于给定的用法,没关系。对于一般用途,它不是。
修改后的代码中的最后一个for
循环和以下内容putchar()
可以(安全地)替换为:
printf("%.*s\n", n, a);
这是安全的,因为指定了长度,因此printf()
不会超出初始化数据。要创建一个以空字符结尾的字符串,输入代码需要为它留出足够的空间:
for (i = 0; i < sizeof(a)-1 && ((c=getchar()) != EOF && c != '\n')
a[i++] = c;
a[i] = '\0';
(注意sizeof(a)-1
!)