Как разрешить ввод пробелов с помощью scanf? - PullRequest
117 голосов
/ 08 августа 2009

Используя следующий код:

char *name = malloc(sizeof(char) + 256); 

printf("What is your name? ");
scanf("%s", name);

printf("Hello %s. Nice to meet you.\n", name);

Пользователь может ввести свое имя, но когда он вводит имя с пробелом, например Lucas Aardvark, scanf() просто обрезает все после Lucas. Как мне сделать scanf() разрешить пробелы

Ответы [ 11 ]

0 голосов
/ 30 сентября 2016

Хотя вы действительно не должны использовать scanf() для такого рода вещей, потому что есть гораздо лучшие вызовы, такие как gets() или getline(), это можно сделать:

#include <stdio.h>

char* scan_line(char* buffer, int buffer_size);

char* scan_line(char* buffer, int buffer_size) {
   char* p = buffer;
   int count = 0;
   do {
       char c;
       scanf("%c", &c); // scan a single character
       // break on end of line, string terminating NUL, or end of file
       if (c == '\r' || c == '\n' || c == 0 || c == EOF) {
           *p = 0;
           break;
       }
       *p++ = c; // add the valid character into the buffer
   } while (count < buffer_size - 1);  // don't overrun the buffer
   // ensure the string is null terminated
   buffer[buffer_size - 1] = 0;
   return buffer;
}

#define MAX_SCAN_LENGTH 1024

int main()
{
   char s[MAX_SCAN_LENGTH];
   printf("Enter a string: ");
   scan_line(s, MAX_SCAN_LENGTH);
   printf("got: \"%s\"\n\n", s);
   return 0;
}
...