2012-01-10 2 views
2

Привет, ребята!Почему входной сигнал разрывается после символа пробега

Здесь:

#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

+1

Я чувствую запах переполнения буфера. – ThiefMaster

+0

Я не знаю точно, но попробуйте напечатать 'c' в' getStr', прежде чем возвращать его. – Azodious

ответ

7

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

+4

Или его буферный переполненный сейф кузена 'fgets' – JayC

14

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

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

+1

Ваш ответ абсолютно правильный. Большое спасибо! –

2

На странице scanf людей:

Matches a sequence of non-white-space characters 

Это ответы ваш вопрос.

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

0

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

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

printf("%s",str); //print the accepted string 
Смежные вопросы