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

麻雀

我想输入一个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

发生了什么?首先,如果您在scanfingtest_cases变量时按下回车键,则stdin上会有一个悬挂的换行符,它将被fgets读取。然后,fgets读入abct [1],但是将终止字符串的空字符存储在下一行。这是因为多维数组连续存储在内存中。后来,def被读取并\0丢失。您想用printf功能打印出您的行printf继续打印字符,直到遇到字符为止\0def的终止符存储在下一行,因此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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

删除第一个数字时出现分段错误

输入第一个元素后出现分段错误

尝试引用char *中的第一个元素时,C中出现分段错误

当我创建一个太大的数组时出现分段错误

尝试打印数组的第一个值时出现分段错误

检查最后一个数组元素

知道每个数组内部的最后一个元素

最后一个数组元素的总和

检查子数组的最后一个元素时出现问题

Ada:获取数组中的最后一个元素时出现前缀问题

计算另一个数组中一个数组的元素的出现

尝试拼接对象的最后一个元素时出现Vue2错误

从向量C ++删除最后一个元素时出现分割错误

尝试获取最后一个元素时出现Haskell错误

数组c ++的最后一个元素的值错误

为什么这个数组的最后一个元素被拼接而不是中间的一个?

如果我尝试将一个数组复制到C中的另一个数组时出现错误消息

为什么弹出堆栈中的最后一个元素会导致C中的分段错误?

我在双向链表中查找最后一个元素的代码抛出分段错误

双链表上的FOR循环不返回最后一个元素。反向给出分段错误

遍历一个数组的时间复杂度是多少,如果当我到达最后一个元素时,我不得不遍历另一个数组一次

当一个数组是另一个数组的元素时如何限制它的元素类型

以firestore数据的角度获取数组的长度和每个数组的最后一个元素

php - 如何将最后两个数组元素合并为一个数组元素

尝试添加数组元素时出现分段错误

将数据从一个数组推到另一个数组时出现问题

我在另一个数组中有一个数组,我想要最后一个元素的值

Fortran 数组的最后一个元素

数组填充了最后一个元素