我需要以整数形式读取用户输入,以将其传递给其他函数。如果我使用我的验证(下面的代码),则在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/

10-11 16:33