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

  • 本文关键字:stdin 读取 出错 一行 fgets 小于 使用 c
  • 更新时间 :
  • 英文 :


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

操作链表所需的所有函数都已经过测试并正常工作。我尝试测试读取字符串是否正确添加到链表中,无论大小如何,如果它小于指定的最大长度,它都是。

问题出现在上一个输入之后的第二次迭代中,其中读取行超过 7 个字符。 然后程序在那一刻崩溃,无论我尝试什么。我在这里完全不知所措。

这是从 stdin 读取一行并将其附加到链表中的函数。 操作链表的所有必要函数、链表的实现和 main 函数都在最后。

void LeerLista(Lista L) {
char temp[100];
int x, i = 1;
printf("introduzca la cantidad de strings deseados:n");
scanf("%d", &x);
flushstdin(stdin); // flush the stdin function defined below
while (i <= x) {   
printf("introduzca la sentencia nro %d (max 100 caracteres):n",i);
if (fgets(temp, sizeof(temp), stdin) != NULL) {   
if (temp[strlen(temp) - 1] == 'n') {   
temp[strlen(temp) - 1] = '';
addCab(temp, L);    // add at the head node of the linked list
} else {
printf("error de entrada limite maximo excedido, intente de nuevo");
--i;
}
} else {
printf("error en lectura, intente de nuevo");
--i;
}
++i;
}
}

在这里,我列出了所有使用的函数和主要函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
typedef struct nodoc {
char *key;
struct nodoc *sig;
} Nodoc;
typedef struct cab {
Nodoc *alpha;
} Cab;
typedef Cab* Lista;
int main(void) {
Lista L = newLista();
LeerLista(L);
printLista(L);
getchar();
return 0;
}
Lista newLista() {
Lista L = malloc(sizeof(Cab));
L->alpha = NULL;
return L;
}
Nodoc *newNodoc(char *c, Nodoc *sig) {
Nodoc *p = malloc(sizeof(Nodoc));
p->key = malloc(sizeof(c));
strcpy(p->key, c);
p->sig = sig;
return p;
}
void addCab(char *k, Lista L) {
Nodoc *p = newNodoc(k, L->alpha);
L->alpha = p;
}
void flushstdin(FILE *where) {
int ch;
while (((ch = fgetc(where)) != 'n') && (ch != EOF))
/* void */;
}

我希望能够将字符串添加到小于最大长度的任何大小的链表中。

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

Introduzca la cantidad de string deseados: 3 Introduzca la sentencia nro 1(最多100个caracteres): 1234567 Introduzca la sentencia nro 2(最多100个caracteres): 1234567 Introduzca la sentencia nro 3 (最多 100 个 caracteres): 1234567 [1234567、1234567、1234567]

如果我尝试输入一个更大的字符串,程序在第二次迭代后崩溃:(我放了一个测试打印语句并打印了链表)

Introduzca la cantidad de string deseados: 3 Introduzca la sentencia nro 1(最多100个caracteres): 12345678 这是一个测试打印链表: [12345678]Introduzca la sentencia nro 2(最多100个caracteres): 1234567

newNodoc()内部,您使用malloc(sizeof(c)),它只为大小创建空间c,这是一个指向char的指针,它本身在您的环境中的大小(似乎)为 8。您似乎打算为该指针引用的字符串腾出空间。但是,函数不知道该大小,sizeof(*c)将是 1,也没有帮助。

如果您已经碰巧知道函数外部存储的长度,您可以明确地将该知识提供给函数,例如通过添加另一个参数来提供大小信息。
但是,对于以 0 结尾的字符串的情况,即使在函数内部,您也可以使用strlen(),而无需额外的参数。(感谢乔纳森·莱夫勒。

最新更新