在C中打印字符串数组时出错

时间:2014-07-26 12:18:44

标签: c arrays char printf

我有一个简单的程序来输入一个包含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

可能是什么问题?

2 个答案:

答案 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终止符。看你是:

  • 用“peter”输入取消终结者
  • 用“david”输入取消终结者

因此你得到输出“peterdavidalan”。现在我想你可以弄清楚“davidalan”输出来自哪里。