不覆盖数组中的元素

时间:2019-02-28 21:33:36

标签: c++ arrays

我正在为我们正在学习的计算机科学课程(应该在其中学习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);
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题是由fgets()的正常行为引起的。它读取的字符数不会超过您指定大小的缓冲区可以容纳的字符,包括终止符的空间。在给定呼叫中未读取的内容将一直在流中等待,并且将在下一个呼叫中读取。

要解决此问题,您必须先检测。您可以通过检查换行符是否存储在目标缓冲区中来实现。如果是这样,那么您就很好,但是如果不是,则仅读取了部分行。还要注意,您无需手动插入终止符-fgets()在成功时将始终包含终止符。

如果您只想丢弃任何多余的字符,那么在第二种情况下,您必须完全这样做-读取并忽略其他字符,直到您已读取换行符或到达文件末尾为止。