Почему ввод прерывается после пробела - PullRequest
2 голосов
/ 10 января 2012

Привет, ребята!

Здесь:

#include <stdio.h>

char* getStr( char *c ){
    scanf( "%s" , c );
    return c;
}

int main(){
    char str[ 100 ];
    getStr( str );
    printf( "%s" , str );
    return 0;
}

Не могли бы вы объяснить, почему строка печатается только до первого пробела. т.е.

ввод: asd asd

вывод: asd

Ответы [ 4 ]

14 голосов
/ 10 января 2012

Это контракт scanf (см. http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html).. Он читает, пока не встретится следующий пробел.

Вы можете изменить строку формата так, чтобы она читалась в двух строках как "%s %s", что будетдве строки, разделенные пробелом.

7 голосов
/ 10 января 2012

Потому что это то, что делает scanf.Если вы хотите прочитать строку до новой строки, используйте gets EDIT: или его двоюродный брат, безопасный для переполнения буфера fgets (спасибо @JayC)

2 голосов
/ 10 января 2012

со страницы руководства scanf:

Matches a sequence of non-white-space characters

Это отвечает на ваш вопрос.

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

0 голосов
/ 17 июня 2013

Если вы хотите взять входные строки с пробелами, вы также можете использовать функцию fgets (), как показано ниже:

char str[50];
printf("Enter a string: ");
fgets(str,50,stdin);

printf("%s",str);  //print the accepted string
...