1

我有以下代码将来自用户的字符串输入 N 次存储在多维数组中。然后打印出第二个元素。

main()
{

    // Array to store 10 strings, 20 characters long.
    char strStorage[10][20];

    printf("\nEnter how many strings: ");
    scanf( "%d" , &num);
    fflush(stdin);

    for ( count = 0 ; count < num ; count++)
    {
        printf("Enter a string: ");
        gets(strStorage[count]);
        fflush(stdin);
    }

    printf("%s", strStorage[2]);

最后一行打印出垃圾。用户输入在垃圾中不可见,因此我的元素访问错误或我的存储错误。任何人都可以帮助我解决问题吗?

提前致谢...

4

2 回答 2

3

strStorage[2]第三个字符串,所以如果num小于3,你不会初始化它,它会包含垃圾。

于 2013-02-13T12:31:50.290 回答
0

scanf("%d", &num);不确保 num 包含一个值。也许明智的做法是检查 scanf 的返回值以确保它读取 1 值,如下所示:if (scanf("%d", &num) != 1) { puts("Error reading integer"); }

当我们讨论这个话题时,我假设 num 和 count 被声明为一个 int,而你已经对我们隐藏了这些声明。啧啧!你需要我们的帮助吗?如果是这样,那么使您的代码可编译!你真的认为 int 适合存储数组的索引吗?它们可能具有负值。我建议改用size_t,%zu格式说明符告诉 scanf 期望来自标准输入的 size_t 值。

...当 size_t 包含的值大于数组中的元素数时会发生什么?我建议研究可变长度数组。

fflush(stdin);是胡说八道,因为 fflush 定义了为输出打开的文件的行为,而 stdin 是一个仅为输入打开的文件。这有点像冲马桶并期望废物从马桶中流出,而不是通过 S 形弯。也许您的意思是丢弃一行的其余部分,因为您从一开始就读取了所需的数据。类似的东西for (int c = getchar(); c >= 0 && c != '\n'; c = getchar());可能会起作用。

不要使用gets. 改为使用fgets(strStorage[count], sizeof strStorage[count], stdin);,以确保不会发生缓冲区溢出。

在那里,我想我几乎涵盖了所有未定义的行为和挑剔的东西。

于 2013-02-13T13:26:45.113 回答