2015-05-04 4 views
0

Я пытаюсь создать программу C, которая может принимать пробелы в scanf и printf, такие как имя и фамилия, как часть самообучающегося текста, который я читаю.Работа с пробелами в scanf и printf

Я хорошо осведомлен о потенциальной вероятности переполнения буфера и таких проблемах безопасности с этими основными/старыми функциями, но это строго для учебных целей, поэтому мне нужно придерживаться их.

Моя программа выглядит следующим образом:

#include <stdio.h> 
#include <conio.h> 

int main(void) 
{ 
    char name[30]; 

    printf("Type your name\n"); 

    scanf("%10[0-9a-zA-Z]", name); 

    printf("%s\n", name); 
    return 0; 
} 

и после компиляции может читать в строке с пробелами, но я могу напечатать только первый фрагмент текста:

C:\Users\hackr>g++ -o whitespace.exe whitespace.c 

C:\Users\hackr>whitespace.exe 
Type your name 
John Doe 
John 

C:\Users\hackr> 

ответ

2
scanf("%29[0-9a-zA-Z ]", name); 
        ^

Вы забыли добавить пробел к принятым символам в вашем регулярном выражении. Кроме того, если ваш буфер равен 30 байтам, вы должны принять 29 символов, а не 10. Оставить место для символа NUL.

Следует отметить, что в следующий раз, когда вы читаете от stdin, он будет читать символы в этой строке, которые не были в пределах первых 29 символов этого scanf, прежде чем он начнет считывать ввод из следующей строки. Для того, чтобы исправить это, добавьте это после scanf:

while (getchar() != '\n') 
    ; // read input to end of line 

Это всегда будет работать, так как '\n' не в ваших принятых символов для регулярных выражений, так что останется в stdin буфере.

+0

Спасибо! Это работает для меня. –

1

Попробуйте вместо

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

Это будет читать до новой строки встречается.

+0

Это тоже работает! Вероятно, это лучший способ сделать это, потому что это проще. Спасибо –

+0

'scanf ("% [^ \ n] ", name);' ничего не скажет в 'name', оставив его неинициализированным, если первым ключом является . – chux

+0

Мне придётся перевернуть монету, на которой из двух решений обозначить как принято, потому что они оба очень хорошие ответы, и они были написаны в одно и то же время. –

Смежные вопросы