Вопрос:

Невозможно найти ошибку в коде, который записывает каждое слово строки в новой строке

c

41 просмотра

3 ответа

6 Репутация автора

Я пишу код, который принимает строку в качестве входных данных и печатает каждое слово в строке в новой строке.

Я использую указательную арифметику для этой цели

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

int main() {
  char *s;
  s = malloc(1024 * sizeof(char));
  scanf("%[^\n]", s);
  s = realloc(s, strlen(s) + 1);
  while (*s != '\0') {
    if (*s == ' ') {
      printf("\n");
    } else {
      printf("%s", s);
    }
    s++;
  }
  return 0;
}

Входные данные:

i am a beginner. \n  

Выход:

i am a beginner \n   
am a beginnerm a beginner \n   
a beginner \n
beginnereginnerginnerinnernnernererr
Автор: ADITYA SHRIVASTAVA Источник Размещён: 11.08.2019 08:47

Ответы (3)


0 плюса

39 Репутация автора

если вы используете printf с "% s", он печатает всю строку вплоть до \ 0.

вот почему вы видите все предложение в каждой строке (минус несколько символов в начале).

То, как вы использовали указатели в этом коде, я предполагаю, что вы пытаетесь распечатать отдельные символы, поэтому просто переключите "% s" на "% c"

Автор: BarSahar Размещён: 11.08.2019 08:58

1 плюс

4726 Репутация автора

Вместо %sвас нужно %cнапечатать один символ. Кроме того, вам не нужно освобождать память, из которой вы получаете, mallocпоскольку reallocзаботитесь об этом, но вы должны освободить память, из которой вы получили realloc. Да, ОС будет очищаться после вас, но лучше всего высвободить ресурсы, которые вы приобрели. Чтобы сделать это, freeмы не собираемся изменять значение s, вместо этого мы собираемся скопировать его. Вот исправленная версия:

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

int main() {
  char* s;
  s = malloc(1024 * sizeof(char));
  scanf("%[^\n]", s);
  char* p = s = realloc(s, strlen(s) + 1);
  while (*p != '\0') {
    if (*p == ' ') {
      printf("\n");
    } else {
      printf("%c", *p);
    }
    ++p;
  }
  free(s);
  return 0;
}

Входные данные:

My awesome input

Выход:

My
awesome
input

Несколько моментов для вас, чтобы рассмотреть. Если пользователь добавляет несколько пробелов между словами или добавляет что-то вроде '\t', ваша программа не обрабатывает случай правильно.

Автор: Ayxan Размещён: 11.08.2019 09:02

0 плюса

1099 Репутация автора

Я бы сказал, что не очень логично изобретать велосипед, если вам не нужны дополнительные функции или мобильность. То же самое можно сделать более надежно, например:

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

int main()
{
    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);

    char *to_free = s = realloc(s, strlen(s) + 1);
    char *word;

    while ((word = strsep(&s, " \t")) != NULL)
        printf("%s\n", word);

    free(to_free);

    return 0;
}

Это также позволяет вам отслеживать вкладки, а также пробелы (как вы рассматриваете слова). Обратите внимание на переданный аргумент strsep, пробел и табуляцию. Вы можете легко разделить слова, используя ,, и .т.д., просто добавив эти разделители к strsepаргументу.

Также рекомендуется освободить выделенную память.

Автор: Mihir Размещён: 11.08.2019 09:26
Вопросы из категории :
32x32