C 当输入小于最大长度时,使用fgets()从标准输入中正确读取行时出错

C 当输入小于最大长度时,使用fgets()从标准输入中正确读取行时出错,c,C,我正在编写一个函数,该函数读取用户输入并将其放入一个字符串中,然后将该字符串附加到我自己实现的字符串的链表中。我使用fgetc()清理stdin并处理留在缓冲区中的换行符,同时在函数读取的每个字符串末尾附加所需的\0。 仅当输入行少于8个字符时,该函数才能正常工作。我不明白为什么我把最大长度设为100 操作链表所需的所有功能都已经过测试并正常工作。我试着测试读取的字符串是否正确地添加到链表中,如果它小于指定的最大长度,则不管大小如何 问题出现在前一次输入后的第二次迭代中,其中读取行超过7个字符。

我正在编写一个函数,该函数读取用户输入并将其放入一个字符串中,然后将该字符串附加到我自己实现的字符串的链表中。我使用
fgetc()
清理
stdin
并处理留在缓冲区中的换行符,同时在函数读取的每个字符串末尾附加所需的
\0
。 仅当输入行少于8个字符时,该函数才能正常工作。我不明白为什么我把最大长度设为100

操作链表所需的所有功能都已经过测试并正常工作。我试着测试读取的字符串是否正确地添加到链表中,如果它小于指定的最大长度,则不管大小如何

问题出现在前一次输入后的第二次迭代中,其中读取行超过7个字符。不管我怎么做,程序在那一刻崩溃了。我在这里完全不知所措

此函数用于从stdin中读取一行并将其附加到链表中。操作链表所需的所有功能,链表的实现和主要功能都在最后

void LeerLista(列表L){
炭温度[100];
int x,i=1;
printf(“字符串导入:\n”);
scanf(“%d”和&x);
flushstdin(stdin);//刷新下面定义的stdin函数
而(iα=NULL;
返回L;
}
Nodoc*newNodoc(字符*c,Nodoc*sig){
Nodoc*p=malloc(sizeof(Nodoc));
p->key=malloc(sizeof(c));
strcpy(p->key,c);
p->sig=sig;
返回p;
}
void addCab(char*k,Lista L){
Nodoc*p=newNodoc(k,L->alpha);
L->alpha=p;
}
void flushtdin(文件*where){
int-ch;
while(((ch=fgetc(其中))!='\n')&&(ch!=EOF))
/*无效*/;
}
我希望能够向链表中添加任何小于最大长度的字符串

编辑:以下是我输入长度小于8个字符的字符串时的输出:

introduzca la cantidad de strings deseados: 3 introduzca la sentencia nro 1 (max 100 caracteres): 1234567 introduzca la sentencia nro 2 (max 100 caracteres): 1234567 introduzca la sentencia nro 3 (max 100 caracteres): 1234567 [1234567, 1234567, 1234567] 弦乐介绍: 3. 第一号判决简介(最多100克拉): 1234567 第2号判决简介(最多100克拉): 1234567 第3号判决简介(最多100克拉): 1234567 [1234567, 1234567, 1234567]
如果我试图放入一个更大的字符串,程序在第二次迭代后崩溃:(我放入一个testprint语句并打印链接列表)

弦乐介绍: 3. 第一号判决简介(最多100克拉): 12345678 这是一个测试打印链接列表: [12345678]第2号判决简介(最多100克拉): 1234567 在
newNodoc()
内部,您使用
malloc(sizeof(c))
,它只为
c
的大小创建空间,这是指向
char
的指针,它本身的大小(看起来)8在您的环境中。您似乎打算为该指针所引用的字符串腾出空间。但是,函数不知道该大小,
sizeof(*c)
将为1,并且也没有帮助

如果您已经知道要在函数外部存储的长度,您可以显式地向函数提供该知识,例如,通过添加另一个参数来提供大小信息。

但是,对于以0结尾的字符串,您可以使用
strlen()
,即使在函数内部,也不需要附加参数。(感谢Johnathan Leffler。)

执行的确切结果是什么?程序在屏幕上打印什么?是否存在编译器警告/错误?请列出它们。这是“我使用fgetc()清理stdin”和此
flushstdin(stdin);
冲突。不要尝试刷新输入。或者,对于字符串,可以使用
strlen()
来确定它的长度。@JonathanLeffler当然可以。我会加上它。错过了它。哇,这是一个很容易的错误,我知道我与指针大小有关,因为它太像了,非常感谢!现在我将看到-m32命令发生了什么,因为它似乎不起作用,现在我看到了你关于flush函数的评论,我想要它问:有没有更好的方法来做?我用它在SCANF的NeXLIN之后清理,这个评论听起来像是矛盾的。请详细说明。如果这个问题得到解决,请考虑做一个新的问题,A为改变的代码和(改变,我想)。问题。你会得到别人的答案,我会在这里呆上几个小时。 introduzca la cantidad de strings deseados: 3 introduzca la sentencia nro 1 (max 100 caracteres): 12345678 this is a test printing linked list: [12345678]introduzca la sentencia nro 2 (max 100 caracteres): 1234567