在fgets调用之后写入char数组会导致它根据strlen为空

时间:2014-04-20 03:37:14

标签: c variable-assignment fgets strlen

因为我遇到的问题是与任务有关并且已经解决了我已经决定删除​​代码。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您有char choice[1];,但随后致电fgetsTrim(choice, 2)。然后调用fgets(choice, 2, stdin)导致缓冲区溢出(从而导致未定义的行为)。

要解决此问题,请将choice放大。但是你的代码中有很多神奇的数字。尽可能使用sizeof,并在其他地方使用#define常量。

你可能想要至少3。如果大小为2,则fgets将仅提取人员输入的数字,而不是换行符。然后,您下次拨打fgets,无论身在何处,都会接听该换行符。为了方便用户,您应该使用相当大的缓冲区,没有理由不这样做。

例如:

char choice[80];
// ...
fgetsTrim(choice, sizeof choice);

对于结构名称:

#define STRUCT1_SIZE 20
char struct1[STRUCT1_SIZE] = { 0 };   // don't need to set it to zero later
// ... in function
fgetsTrim(struct1, STRUCT1_SIZE);

另一个问题是char password[6] = "Fedora";。这不是字符串,因为它不是以null结尾的。但是你调用login(password)然后调用strncmp,这是一个期望以空字符结尾的字符串的函数。所以你有一个读缓冲区溢出。

要解决此问题,请改为编写char password[] = "Fedora";,然后编译器会为您选择合适的大小。

修改createStruct功能存在严重问题。看起来您认为可以将用户的输入用作类型名称......您无法做到。行typedef struct fileProperties struct1;表示代码中的令牌struct1 对该结构进行别名。然后您的printf("%s", struct1...将无法编译,因为struct1现在是类型名称。