如何防止C中字符串数组的其余部分填充垃圾?
我正在做一个练习程序,用户输入一个名字列表。我已经将字符串数组设置为50长,以给用户足够的空间,但是如果完成了,他们可以键入'quit'停止键入。如何防止数组的其余部分填充垃圾,或者可能将其缩小到只适合输入的列表如何防止C中字符串数组的其余部分填充垃圾?,c,arrays,c-strings,C,Arrays,C Strings,我正在做一个练习程序,用户输入一个名字列表。我已经将字符串数组设置为50长,以给用户足够的空间,但是如果完成了,他们可以键入'quit'停止键入。如何防止数组的其余部分填充垃圾,或者可能将其缩小到只适合输入的列表 #include <stdio.h> #include <string.h> int main() { char list[50][11]; char temp[11]; int index; printf("Input a list
#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;
}
#包括
#包括
int main()
{
字符列表[50][11];
炭温[11];
整数指数;
printf(“输入名称列表,键入'quit'停止\n”)
对于(索引=0;索引<50;索引++)
{
扫描频率(“%10s”,温度);
如果(strcmp(临时,“退出”)!=0)
{
strcpy(列表[索引],温度);
}
其他的
{
指数=50;
}
}
对于(int-index=0;index<50;index++)
{
看跌期权(列表[索引]);
}
返回0;
}
在我看来,这是一个关于编程问题的禅宗,邪恶之羊正在激励你朝着正确的方向思考
什么是垃圾?你已经告诉计算机你需要一份50件物品的清单,但是你没有告诉它在所有这些清单条目中放什么。因此,计算机只使用它所拥有的内存,而一个特定字节被认为不是垃圾的值的概率大约为1:256
当然,这里的禅宗不是对“什么是垃圾”问题的答案,而是理解有垃圾而不是垃圾,唯一不是垃圾的是你安排存在的东西
所以,如果您不知道内存地址不包含垃圾,那么它确实包含垃圾
那么,编程问题的解决方案就是跟踪有多少列表条目不是垃圾。在C语言中有两种常用的方法:
索引
。只需记录使用量即可。不要访问阵列中未使用的部分
for(int i = 0; i < index; i++) {
puts(list[i]);
}
只需对输入的值进行计数
int count = 0;
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);
count++;
}
else
{
index = 50;
}
}
for(int index = 0; index < count; index++)
{
puts(list[index]);
}
int count=0;
printf(“输入名称列表,键入'quit'停止\n”)
对于(索引=0;索引<50;索引++)
{
扫描频率(“%10s”,温度);
如果(strcmp(临时,“退出”)!=0)
{
strcpy(列表[索引],温度);
计数++;
}
其他的
{
指数=50;
}
}
for(int index=0;index
请显示一个,并解释为什么需要在空终止符后收缩它或防止“垃圾数据”。如果您不访问它,则数组末尾的垃圾数据是无害的。C中的数组不携带长度信息,因此必须将该信息与数组一起存储。有两种常见的模式:将实际数组长度保持为avariable,并编写函数,以便接受数组加上长度。或者,使用哨兵值,例如空字符串或空指针。这就是C字符串的工作方式。在这两种情况下,您必须注意不要使数组大小溢出。只需将所有内容初始化为零:char list[50][11]={0}代码>
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
int count = 0;
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);
count++;
}
else
{
index = 50;
}
}
for(int index = 0; index < count; index++)
{
puts(list[index]);
}