我需要以整数形式读取用户输入,以将其传递给其他函数。如果我使用我的验证(下面的代码),则在4个错误的输入后崩溃。我不确定这是否是缓冲区错误。但是我也没有找到验证我的输入并处理错误的正确方法。我没有故意使用scanf(%d)
,因为我想避开CLion在使用它时给我的警告。我希望这里有人可以向我解释为什么在4个错误的输入后我的代码崩溃,以及如何解决它,或者向我展示一种替代方法。
char *userInput = malloc(100);
long amountOfPlayers;
//Todo: More Validation needed, bufferoverflow
for (int i = 0; i < sizeof(userInput) / sizeof(*userInput); i++) {
char *end;
printf("Please enter the amount of players: ");
scanf("%s", userInput);
amountOfPlayers = strtol(userInput, &end, 10);
if (end == userInput) {
printf("wasn't a number\n");
}
else if (end[0] != '\0') {
printf("trailing characters after number %ld: %s\n", amountOfPlayers, end);
}
else
return init_playerList(amountOfPlayers);
}
最佳答案
userInput
是指针,而不是数组,因此sizeof(userInput)
返回指针的大小,通常为4个字节。 sizeof(*userInput)
是sizeof(char)
,即1
。因此sizeof(userInput) / sizeof(*userInput)
为4,这意味着您的for
循环仅执行4次。见How to find the 'sizeof' (a pointer pointing to an array)?
无需for
循环,只需使用while (true)
。您没有做任何迭代userInput
元素的事情,它只是缓冲区。
也没有理由用malloc()
分配它,您只需声明:
char userInput[100];
您有内存泄漏,因为从函数返回之前从未
free(userInput)
。但是,如果将其声明为数组,则没有必要。为了防止缓冲区溢出,您应该使用:
scanf("%100s", userInput);
关于c - 验证用户输入时如何处理缓冲区错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48592121/