由于我遇到的问题与作业相关并且已经解决,所以我决定删除代码。感谢您的帮助。
最佳答案
您有 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/