gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:45 24 4
gpt4 key购买 nike

由于我遇到的问题与作业相关并且已经解决,所以我决定删除代码。感谢您的帮助。

最佳答案

您有 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,这是一个需要以 null 结尾的字符串的函数。所以你有一个读取缓冲区溢出。

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

编辑:createStruct 函数存在严重问题。似乎您认为可以将用户的输入用作类型名称……但您不能。行 typedef struct fileProperties struct1; 表示标记 struct1 在您的代码中 别名为该结构。那么你的 printf("%s", struct1... 将不会编译,因为 struct1 现在是一个类型名称。

关于c - 根据 strlen,在 fgets 调用后写入 char 数组会导致它为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23178150/

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