在多维数组中存储和检索字符串

时间:2013-02-13 12:24:07

标签: c arrays string

我有以下代码,用于在多维数组中存储来自用户的字符串输入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]);

最后一行打印出垃圾。垃圾内部看不到用户输入,因此我的元素访问错误或存储错误。任何人都可以帮我解决问题是什么?

提前致谢...

2 个答案:

答案 0 :(得分:3)

strStorage[2]第三个字符串,因此如果num小于 3 ,则不会初始化它并且它将包含垃圾。

答案 1 :(得分:0)

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

当我们讨论这个话题时,我假设num和count被声明为int,你隐藏了我们的声明。 Tsssk!你想要我们的帮助吗?如果是这样,那么让您的代码可编辑!你真的认为int适合存储索引到数组吗?它们可能具有负值。我建议使用size_t,而%zu格式说明符告诉scanf期望stdin的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);,以确保不会发生缓冲区溢出。

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