我有以下代码,用于在多维数组中存储来自用户的字符串输入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]);
最后一行打印出垃圾。垃圾内部看不到用户输入,因此我的元素访问错误或存储错误。任何人都可以帮我解决问题是什么?
提前致谢...
答案 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);
,以确保不会发生缓冲区溢出。
在那里,我想我几乎涵盖了所有未定义的行为和挑剔的东西。