gpt4 book ai didi

c - 输入最后一个数组元素时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:10 25 4
gpt4 key购买 nike

我想输入一个字符串数组。输入的字符串数量等于测试用例的数量。但是当我尝试输入最后一个元素时,出现段错误。这是代码。

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];

这声明了一个可以容纳 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

发生了什么事?首先,如果您在 scanfing test_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 终止符留出额外的空间。

关于c - 输入最后一个数组元素时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25322140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com