Intereting Posts
Тестирование getchar () == EOF не работает должным образом Самый быстрый способ скопировать несколько двумерных массивов в один одномерный массив (в C) Выполняет ли pow () работу с типом данных int в C? Как заменить select () на kevent () для повышения производительности? У Windows API есть элемент управления прокруткой? Как инициализировать переменную wchar_t? почему эта двухзначная нотация указателя работает, а другая – Что означает psz в pszBuffer или аналогичном? Как я могу получить количество ядер в устройстве cuda? Ошибка при соединении libxml2 Замена extrordinarily slow pow () Строчные буквы для символов верхнего регистра в C и записи в файл Циклы сообщений Win32: Выход после закрытия windows с помощью GetMessage (& msg, NULL, 0, 0)? C связанный список, почему моя переменная головного списка остается нулевой (новая для C) Выполнение матричных операций с комплексными числами в C

Как принимать пробелы во входных данных на C

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

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

char address[100]; scanf("%s", address); 

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

 char address[100]; fgets(address, 100, stdin); 

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

Благодаря Крису (ниже), в отношении частичных линий.

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

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

Есть способы сделать это с помощью scanf() , но по моему скромному мнению они уродливые быстро. Общий шаблон (который на удивление еще не упоминался) состоит в том, чтобы прочитать строку с помощью fgets() а затем использовать sscanf() для ее обработки. sscanf() работает как scanf() , только вместо обработки стандартного входного streamа обрабатывает строку, которую вы передаете ему (так же связаны 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() читает не более одного символа размера из streamа и сохраняет их в буфер, на который указывает s. Чтение останавливается после EOF или новой строки. Если читается новая строка, она сохраняется в буфере. A ‘\ 0’ сохраняется после последнего символа в буфере.

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

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

(Из-за популярного спроса, refrence to gets() был удален)

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

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

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

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

 #include #include 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  #define charIsimUzunlugu 30 struct personelTanim { char adSoyad[charIsimUzunlugu]; } personel; printf(" your char : "); scanf("%[^\n]",personel.adSoyad); printf("\n\n%s",personel.adSoyad);