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

在C中打印字符串数组时出错,c,arrays,char,printf,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]);

我有一个简单的程序来输入由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;
}
有什么问题吗?

只需更改字符a[10][5];对[5][10]进行字符化; 然后将有5行,每行10列。a的当前设置允许您保留4个字符长的10个输入,因为您需要在字符串末尾添加\0个字符。 C不检查边界,多维数组连续存储在内存中。因此,当输入长度超过4个字符时,您将溢出字符数组的当前存储并写入下一行。 Adam D.Ruppe提到printf将在屏幕上打印字符,直到它遇到\0终止符。确保你是:

带输入的松动终止符 带david输入的松动终止符
因此,您得到了输出peterdavidalan。现在,我想您可以从davidalan输出的来源中找到答案。

C数组语法在我看来相当混乱-它的意思与我通常阅读它的方式相反。。。看起来你也犯了这个错误

数组有10个字符串槽,每个槽有4个字符,而不是5个,因为C中的每个字符串必须以0字符结尾。因此,当您输入peter时,它会溢出5个字符的缓冲区,而不是舒适地放入10个字符的缓冲区,从而保存了以前保存的一个字符


如果没有0终止符,printf将继续运行,因此也会写入其他名称。

char a[10][5]有10个字符串的空间,每个字符串最多4个字符。尝试char a[5][10]={0};对于5个字符串,每个字符串长度不超过9个字符,初始化为零。永远不要使用gets:这是一个非常严重的缺陷,在C11之前它被弃用,然后被禁止。@重复数据消除程序,但扫描%s,buf;Remainsi我的答案给出了更多的解释,但这个答案是一个简单的解决办法,只是让它的工作!啊,是的,当我编辑我的帖子时,还没有看到你的答案:相反?从左到右阅读,您会得到:char元素,命名为a,由10个元素组成,每个元素依次由5个元素组成。答案很好。我把它理解为5的数组10的数组,这在我的脑海中是有意义的,因为当你索引它时,你去掉了一层:a[0],对我来说,是说取外部数组的第一个元素。。。。这就是5的数组。[0][1]只是在继续。如果您习惯于以这种方式阅读代码,从右到左可能听起来正好相反,但对我来说,这是阅读此代码的自然方式,与函数和索引一致。。。当然,由于C将数组大小放在变量名之后,而不是其他类型的wtf?!,这两种方法都不管用,因为这种干扰太糟糕了!注释空间用完了,但我的观点主要是C数组语法太糟糕了。我更喜欢其他任何东西:d's char[10][5]a;以我喜欢的方式将其分组。。。但是,像GO的一个[5 ](10)字符也是对C的改进。我觉得GO完全落后了,我发现由于我根深蒂固的习惯而难以阅读,但至少这种类型没有填充在中间的名称。1用于提及\0终止符缺失和打印正在进行:@AdamDRuppe声明镜像使用。。。s[0]是第一个字符串,s[1]是第二个字符串,s[2]是第三个字符串,对吗?因此s[0][9]是第一个字符串中的第10个字符。正如buf[9]是buf中的第10个字符。请记住,它是一个数组数组,即char s[5][10]是一个包含5个元素的数组,每个元素都是一个包含10个元素的数组。
tom
john
peterdavidalan
davidalan
alan