Как взять пробел во вводе в C - PullRequest
8 голосов
/ 12 октября 2009

Я хотел взять массив символов из консоли, и он также включает пробелы. Единственный метод, который я знаю в C, это scanf, но он пропускает остановку ввода после попадания пробела.Что я должен делать?

Вот что я делаю.

char address[100];

scanf("%s", address);

Ответы [ 7 ]

14 голосов
/ 12 октября 2009

Попробуйте использовать fgets (). Он будет читать полную строку из потока по вашему выбору (стандартный, я думаю, вы ищете). Пример для вашего случая:

char address[100];

fgets(address, 100, stdin);

fgets () будет считывать самое большее количество символов, переданных во втором аргументе (минус один). Нет переполнения буфера, и вы получите всю строку до символа новой строки (или до EOF). Обратите внимание, что, поскольку максимальное количество символов для чтения является одним из параметров, возможно, вы получите частичную строку. Проверьте, является ли последний символ в возвращаемой строке '\ n', и вы узнаете, что получили полную строку. Обнаружение EOF тоже довольно просто; NULL возвращаемое значение и проверка на errno должны помочь вам.

Спасибо Крису (ниже) за пункт о частичных строках.

7 голосов
/ 12 октября 2009

Вы можете попробовать что-то вроде этого:

char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);
1 голос
/ 12 октября 2009

Есть способов сделать это с scanf(), но, по моему скромному мнению, они становятся ужасно быстрыми. Обычный шаблон (который на удивление еще не был упомянут) - это читать строку с fgets(), а затем использовать sscanf() для ее обработки. sscanf() работает как scanf(), только вместо обработки стандартного входного потока он обрабатывает строку, которую вы передаете ему (так же, как связаны printf() и sprintf()). Основы:

char s[100], str[100];
int i, x;
fgets(s, 100, stdin);
if(sscanf(s, "%d %x %s", &i, &x, str) != 3)
  {
    // our three variables weren't all set - probably an invalid string
    // either handle the error or set default values here.
  }
0 голосов
/ 18 февраля 2014

Мой стиль.

 #include <stdio.h>

    #define charIsimUzunlugu 30

        struct personelTanim
        {       
            char adSoyad[charIsimUzunlugu];             
        } personel;

    printf(" your char       : ");
    scanf("%[^\n]",personel.adSoyad);

    printf("\n\n%s",personel.adSoyad);
0 голосов
/ 28 июня 2013

Если вы хотите получить ввод до новой строки, используя динамический массив внутри структуры, это может быть полезно:

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

struct student{
char *name;
};

int main()
{
        struct student s;

        s.name = malloc(sizeof(char *));

        printf("Name: ");
        // fgets(s.name, 10, stdin); // this would limit your input to 10 characters.

        scanf("%[^\n]", s.name);   

        printf("You Entered: \n\n");

        printf("%s\n", s.name);
}
0 голосов
/ 12 октября 2009

Лично я бы использовал fgets, но здесь уже было указано. Один из способов сделать это с помощью scanf будет

scanf("%[^\n]", address);

Это занимает все символы, пока не будет найдено \ n.

0 голосов
/ 12 октября 2009

См. fgets()

fgets() считывает из потока не более одного символа меньшего размера и сохраняет их в буфере, указанном s. Чтение останавливается после EOF или новой строки. Если читается новая строка, она сохраняется в буфере. '\ 0' сохраняется после последнего символа в буфере.

char *fgets(char *s, int size, FILE *stream);

Дополнительная информация доступна во многих вопросах SO, например, input-string-through-scanf .

(В связи с популярным спросом ссылка на gets() была удалена)

...