Как сделать пробел в ввода в C

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

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

char address[100];

scanf("%s", address);

7 ответов


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

char address[100];

fgets(address, 100, stdin);

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

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


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

char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);

здесь способы сделать это с 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.
  }

посмотреть fgets()

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

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

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

(из-за к популярному требованию, refrence к gets() удален)


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

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

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


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

#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);
}

мой стиль.

 #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);