因为我遇到的问题是与任务有关并且已经解决了我已经决定删除代码。谢谢你的帮助。
答案 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
现在是类型名称。