我想输入一个array数组。输入的字符串数等于测试用例数。但是,当我尝试输入最后一个元素时,出现了分段错误。这是代码。
int main()
{
int test_cases=0;
scanf("%d",&test_cases);
char t[100][test_cases];
int length=0;
int i;
for(i=0;i<test_cases;++i)
{
fgets(t[i],100,stdin);
}
return 0;
}
考虑一下您的代码:
scanf("%d",&test_cases);
char t[100][test_cases];
这声明了一个char数组,可以容纳100个条目,每个条目很test_cases
长。然后在您的循环中:
for(i=0;i<test_cases;++i)
{
fgets(t[i],100,stdin);
}
查看如何fgets
声明:
char *fgets(char *s, int size, FILE *stream);
您正在将每个100字节长的输入写入每个条目。之前您已经声明它很test_cases
长。假设您test_cases
等于3,并且已添加代码以打印出已存储的字符:
for(i=0;i<test_cases;++i)
{
printf("%s\n", t[i]);
}
然后按以下顺序键入:
abc
def
糟糕,您想输入第三个字符串,但是循环终止。您的输出是
abcdef
def
发生了什么?首先,如果您在scanf
ingtest_cases
变量时按下回车键,则stdin上会有一个悬挂的换行符,它将被fgets读取。然后,fgets读入abc
t [1],但是将终止字符串的空字符存储在下一行。这是因为多维数组连续存储在内存中。后来,def
被读取并\0
丢失。您想用printf
功能打印出您的行。printf
继续打印字符,直到遇到字符为止\0
。def
的终止符存储在下一行,因此printf终止于此。第二输入正确打印。
目前,t
数组看起来像:
t[0] - \n
t[1] - abc
t[2] - def
t[3] - \0
/* in memory: */
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| \n | | | a | b | c | d | e | f | \0 | | |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ . . .
|_________________|_________________|_________________|_________________|
t[0] t[1] t[2] t[3]
幸运的是,您还有更多行要存储\ 0。
所以你有错字。您可能打算声明一个char数组,该数组可以容纳test_cases
每个100字节长的条目,即
char t[test_cases][100]
但是,您仍然会丢失数组的一行,因为fgets
它将停止读取该悬挂的换行符(有100个字节未使用!)。为了解决这个问题,在scanf之后,您可以调用一个getchar()
函数,或者按ctrl + d组合键(这将导致发送EOF)。Scanf需要知道您已经完成了specyfing test_cases
。还要记住要为\ 0终止符留出额外的空间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句