C - петля не сломается - PullRequest
0 голосов
/ 07 мая 2011

Я хочу, чтобы цикл прерывался при нажатии «Enter». Есть предложения?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define len 20
#define limit 100

//Prototypes for functions
int read_word(char str[], int n);



int main(void)
{
  char *p;
  char word[len+1];
  int i=0, nwords = 0;

//Loop for reading in words and allocating an array 
  for (;;)
   {
      if (nwords == limit)
       {
          printf("Insufficient Space\n");
          break;
       }
      printf("Enter word: ");
      scanf("%c", &word);
      p = (char*) malloc(nwords*sizeof(char));
      p[i]= read_word(word, len);
      i++;

      if (p == NULL)
      {
          printf("Insufficient Space\n");
          break;
      }
  }

  for(i=0; i<nwords; i++)
      printf(" %s\n", p[i]);

  return 0;

  } 
int read_word(char str[], int n)
{
  char ch; 
  int i = 0;

  while((ch = getchar()) != '\n')
      if (i<n)
          str[i++] = ch; 
  str[i] = '\0';
  return i;
}

1 Ответ

1 голос
/ 07 мая 2011

Ваш scanf вызов читает первый символ, а затем ваша read_word функция перезаписывает его. Если вызов scanf читает символ новой строки, он будет игнорироваться.

Строки:

  p = (char*) malloc(nwords*sizeof(char));
  p[i]= read_word(word, len);

... также выглядит неправильно. read_word возвращает целое число (длина прочитанной строки), но вы сохраняете в массив char. Кроме того, вы перераспределяете память для p каждый раз в цикле, поэтому сохраненные ранее значения будут потеряны.

Исправить:

  • измените p на int * и инициализируйте его нулем
  • изменить malloc вызов на подходящий realloc
  • убрать звонок на scanf целиком
  • переместить чек для p == null до присвоения `p = (char *) malloc (nwords * sizeof (char)); '

Или: p означает массив строк (самих слов), а не длину слова? В этом случае вы должны:

  • изменить p на char **
  • изменить размер выделения (для вызова realloc) на nwords * sizeof(*p)
  • выделить (используя malloc) память для каждого слова вместо того, чтобы word был массивом, выделенным стеком
  • установить p[i] = word; вместо текущего назначения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...