如何防止C中字符串数组的其余部分填充垃圾?

如何防止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

我正在做一个练习程序,用户输入一个名字列表。我已经将字符串数组设置为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;
}
#包括
#包括
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语言中有两种常用的方法:

  • 跟踪列表的长度,或
  • 在列表末尾添加一个特殊值
  • 如何防止数组的其余部分填充垃圾(?)

    1) 使用
    索引
    。只需记录使用量即可。不要访问阵列中未使用的部分

        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]);
       }