Введите указатель на массив Array, используя Scanf, но при вводе строки после того, как «пробел» обрезается - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу ввести массив указателей символов, используя функцию Scanf, когда я запускаю эти фрагменты кода, когда после «пробела» сокращается остальная часть строки:

enter image description here

Я хочу напечатать всю строку ввода

Код:

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

int main() {
    char *str = malloc(sizeof(char)*4);
    printf("Enter The String: ");
    scanf("%s", str);
    printf("The String is: %s\n", str);
    return 0;
}

1 Ответ

1 голос
/ 27 апреля 2020
#include <stdio.h>
#include <stdlib.h>

int main() {
  char *str = malloc(12);

  printf("Enter The String: ");
  if (scanf(" %11[^\n]", str) == 1)
    printf("The String is: %s\n", str);
  free(str);
  return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
Enter The String: Hello World
The String is: Hello World
pi@raspberrypi:/tmp $ ./a.out
Enter The String:    Hello World!
The String is: Hello World
pi@raspberrypi:/tmp $ ./a.out < /dev/null
Enter The String: pi@raspberrypi:/tmp $ 

В scanf(" %11[^\n]", str):

  • пробел перед '%' позволяет пропустить пробелы (в широком смысле слова также вкладка newline et c) в начале строки
  • '11 'ограничивает сохранение в str до 11 символов без учета окончательного нулевого символа, также помещенного в str , иначе из массива будет записан ввод длиной более 11 символов
  • [^\n] позволяет читать до конца строки (новая строка не сохраняется), предполагая, что это не так слишком длинный (см. пример с «Hello World!»), пробелы внутри строки не рассматриваются как разделитель, как это имеет место с %s
...