Как сохранить остаток строки в C от заполнения мусором? - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю над тренировочной программой, где пользователь вводит список имен. У меня есть массив строк длиной 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;
}

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

IMO, это вопрос дзен программирования, и UnholySheep подталкивает вас к мысли в правильном направлении.

Что такое мусор? Вы сказали компьютеру, что вам нужен список из 50 вещей, но вы не сказали ему, что добавить во все эти записи списка. Таким образом, компьютер просто использует всю память, которая у него есть, и вероятность того, что конкретный байт будет равняться значению Not Junk, примерно равна 1: 256.

Конечно, дзен здесь не является ответом на вопрос «Что такое мусор», а скорее понимание того, что есть мусор и не мусор, и единственный не мусор - это то, что вы организовали для существования.

Итак, если вы этого не знаете адрес памяти не содержит мусора, тогда он есть.

Решение вашего программного вопроса состоит в том, чтобы отслеживать, сколько записей в списке не является ненужным. Для этого в C используются два общих подхода:

  1. отслеживать длину вашего списка или
  2. ставить специальное значение в конец списка
0 голосов
/ 01 мая 2020

просто вести подсчет введенных значений

   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]);
   }
0 голосов
/ 01 мая 2020

как я могу предотвратить заполнение остатка массива ненужным (?)

1) Использовать index. Просто следите за тем, сколько было использовано. Не получать доступ к неиспользуемой части массива

    for(int i = 0; i < index; i++) {
      puts(list[i]);
    }

2) Пометить следующее неиспользуемое начальным нулевым символом .

    if (index < 50) list[index][0] = '\0';

    for(int i = 0; i < 50 && list[i][0]; i++) {
      puts(list[i]);
    }

3) Перепроектировать : используйте массив размещения правильного размера (ниже), список ссылок и т. д. c.


или, возможно, уменьшите его, чтобы он соответствовал только введенному списку (?)

Как только массив определен, его размер не может измениться.

И все же указатель на выделенную память может быть перераспределен.
Здесь list - это указатель на массив 11 символов

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
...