在阵列中没有覆盖元素

Not overwriting elements in arrays

本文关键字:覆盖 元素 阵列      更新时间:2023-10-16

我正在编写我们应该在我正在学习的计算机科学课程中,学习C 的程序的代码。在此程序中,我试图让用户输入他们可能喜欢的爆米花口味,但没有超过10(或9个字符)。当我尝试包括具有> 10个字符的口味时,该程序不会导致错误或正常工作,而只会将超过10个字符存储在数组中的下一个元素中。我如何阻止程序这样做?

#define POP_COUNT 5
#define POP_SIZE 10 
int main() {
    char popcorn[POP_COUNT][POP_SIZE];
    fputs("Enter your 5 favourite popcorn flavours: n", stdout);
    for (int i = 0; i < POP_COUNT; i++) {
        fgets(popcorn[i], POP_SIZE, stdin);
        popcorn[i][POP_SIZE - 1] = 0;
    }
    cout << popcorn[0] << endl;
    cout << popcorn[1] << endl;
    fputs("Your favourite flavours are: n", stdout);
    for (int i = 0; i < POP_COUNT; i++) {
        fputs(popcorn[i], stdout);
    }
}

您的问题来自fgets()的正常行为。它不会比您指定的大小可以容纳的尺寸的缓冲区读取更多的字符,包括终结器的空间。无论它在给定的电话上没有阅读的内容是否仍在流中等待,并将在下一个呼叫上阅读。

要解决这个问题,您必须首先检测。您可以通过检查是否存储在目标缓冲区中的新线来做到这一点。如果是这样,那么您就很好,但是如果不是,那么只有一条部分。请注意,您也无需手动插入终结器 - fgets()将始终包含成功的终结器。

如果您只想丢弃任何额外的字符,那么在第二种情况下,您必须做到这一点 - 读取并忽略其他字符,直到您读取了newline或到达文件的末尾。