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

标签 c variable-assignment fgets strlen

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

最佳答案

您有 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/

相关文章:

c++ - 如何将多个数字加到变量中

c - 用户输入的数组元素之和的问题

c - 在C中删除结构内部的字符串

将 long 转换为 (void *) 以传递

c++ - 如何设置、清除和切换单个位?

Matlab:分配给具有列\行索引对的矩阵

r - 生成变量名(类似于 get())

c - 在此代码中可以将 8 位或 16 位值存储到 16 位对齐缓冲区吗?

php - fgets 的输出与文件格式不匹配

c - 文本文件内的文本单词搜索 - C 编程