我正在练习程序中,用户输入名称列表。我已经将字符串数组设置为50个长字符串,以便为用户提供足够的空间,但是如果完成,他们可以键入“ quit”以停止键入。我怎样才能防止其余部分填充垃圾或缩小它以仅适合输入的列表。
#include <stdio.h>
#include <string.h>
int main()
{
char list[50][11];
char temp[11];
int index;
printf("Input a list of names type 'quit' to stop\n")
for(index = 0; index < 50; index++)
{
scanf(" %10s", temp);
if(strcmp(temp, "quit") != 0)
{
strcpy(list[index], temp);
}
else
{
index = 50;
}
}
for(int index = 0; index < 50; index++)
{
puts(list[index]);
}
return 0;
}
IMO这是编程问题的禅宗,UnholySheep促使您以错误的方向思考。
什么是垃圾?您已经告诉他们计算机您需要50样东西的列表,但是您没有告诉它在所有这些列表项中放置什么。因此,计算机只使用它所拥有的任何内存,而某个特定字节作为您确定为“ No Junk”的值的几率就是1:256。
当然,这里的禅宗不是“什么是垃圾”问题的答案,而是理解存在垃圾和非垃圾,而唯一的“非垃圾”是您安排存在的垃圾。
因此,如果您不知道内存地址不包含垃圾邮件,那么它就包含垃圾邮件。
那么,您的编程问题的解决方案是,跟踪多少个列表列表不是垃圾列表。为此,C中使用了两种常用方法:1.跟踪列表的长度,或者2.在列表的末尾添加一个特殊值
我如何使数组的其余部分不被垃圾填满(?)
1)使用index
。只需跟踪使用了多少。不要访问数组的未使用部分
for(int i = 0; i < index; i++) {
puts(list[i]);
}
2)用前导null character
标记下一个未使用的 if (index < 50) list[index][0] = '\0';
for(int i = 0; i < 50 && list[i][0]; i++) {
puts(list[i]);
}
3)重新架构:使用合适大小的分配数组(如下),链接列表等。>
,其大小将无法更改。但可以重新分配指向已分配数组的指针。或可能缩小它以使其仅适合输入的列表(?
一旦定义了[[array
char (*)list[11] = malloc(sizeof *list * 50); // error checking omitted for brevity
....
// fill up to 50
....
list = realloc(sizeof *list * index); // error checking omitted for brevity