我如何防止C语言中的其余字符串数组被垃圾填满?

问题描述 投票:-1回答:2

我正在练习程序中,用户输入名称列表。我已经将字符串数组设置为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;
}
c arrays c-strings
2个回答
1
投票

IMO这是编程问题的禅宗,UnholySheep促使您以错误的方向思考。

什么是垃圾?您已经告诉他们计算机您需要50样东西的列表,但是您没有告诉它在所有这些列表项中放置什么。因此,计算机只使用它所拥有的任何内存,而某个特定字节作为您确定为“ No Junk”的值的几率就是1:256。

当然,这里的禅宗不是“什么是垃圾”问题的答案,而是理解存在垃圾和非垃圾,而唯一的“非垃圾”是您安排存在的垃圾。

因此,如果您不知道内存地址不包含垃圾邮件,那么它就包含垃圾邮件。

那么,您的编程问题的解决方案是,跟踪多少个列表列表不是垃圾列表。为此,C中使用了两种常用方法:1.跟踪列表的长度,或者2.在列表的末尾添加一个特殊值


0
投票

我如何使数组的其余部分不被垃圾填满(?)

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

© www.soinside.com 2019 - 2024. All rights reserved.