我有一个简单的程序来输入一个包含5个字符串的数组并输出它们。但输出有些奇怪。以下是我的代码。
#include <stdio.h>
int main()
{
char a[10][5];
int i;
for(i=0; i<5; ++i)
{
printf("\nEnter the name of %d st student:", i+1);
fflush(stdout);
gets(a[i]);
}
for(i=0; i<5; ++i)
{
printf("\n%s", a[i]);
fflush(stdout);
}
return 0;
}
我将输入作为tom,john,peter,david和alan,我得到以下输出。
tom
john
peterdavidalan
davidalan
alan
可能是什么问题?
答案 0 :(得分:7)
C数组语法让IMO非常困惑 - 这意味着我通常阅读它的方式相反......而且看起来你也犯了这个错误。
你的数组有10个字符串,每个字符串4个字符(它不是5,因为C中的每个字符串必须以0字符结尾)。因此,当您输入peter
时,它不会轻易地适应10个字符缓冲区,而是溢出5个字符缓冲区,从而节省了之前保存的一个字符。
如果没有0终止符,printf将继续运行,因此也写出其他名称。
答案 1 :(得分:2)
只需将char a[10][5];
更改为char a[5][10];
你将有5行,每行10列。当前设置a
允许您保存10个4个字符长的输入(因为您需要在字符串末尾添加\0
个字符)。
C不检查边界,多维数组被存储在内存中。因此,如果输入超过4个字符,则会溢出char数组的当前存储并写入下一行。
Adam D. Ruppe提到printf()
将打印字符到屏幕,直到它遇到\0
终止符。看你是:
因此你得到输出“peterdavidalan”。现在我想你可以弄清楚“davidalan”输出来自哪里。