2016-04-07 2 views
0

Я использую GCC для компиляции кода на C. Мой второй scanf не останавливается, чтобы получить вход. Он только читает в первом scanf и печатает два утверждения: одно с тем, что я ввел в строку, а другое просто пустое.Смутно о GCC и scanf в C

int main (void) { 
    setvbuf(stdout, NULL, _IONBF, 0); 

    char string[25] = {'\0'}; 
    char c; 

    scanf(" %s", string); 

    scanf(" o%c", &out); 

    printf("Input is : %s \n\n", string); 
    printf("Out is: %c", out); 

    return 0; 
} 

Вместо того, чтобы

Input является то, что я напечатал и приглашение ввести символ для вне

я получил выход, как показано ниже

Input is : whatever i typed 
Out is: 

Программа завершается. Может кто-то помочь. Я провел некоторое исследование и попытался разместить пробел до %c, а для строки и ничего не произошло.

+0

Просьба уточнить * exaccty *, какой вклад вы дали. Лучше всего запустить программу и вставить в * точный * журнал. Ваш второй 'scanf' ожидает, что вход будет содержать букву' o', за которой следует другой символ. Это действительно то, что вы намеревались? – kaylum

+0

Является ли 'o' действительно в строке формата' 'o% c" '? Обратите внимание, что '% s' прекращает чтение в первом пробеле после символа без пробела. –

ответ

4

Вы не указали out. И c здесь не используется. Сказав, что

Изменить

scanf(" o%c", &out); //What is that o in here? Is it a typo? 

в

scanf(" %c", &out); 

Если ваш терминал использует линейный вход буферном

scanf(" %s", string); 

может читать ввод до первого белого пространства. Таким образом, входной буфер из белого пространства не используется, который доступен для следующего scanf, который автоматически начинает считывать из буфера. Так что, если вы вводите строку с пробелами, бело-пространство будет присвоен символ out в вашем случае

Изменение первого зсапЕ, как показано ниже, чтобы очистить буфер:

if(scanf(" %s", string) == 1) 
{ 
while(getchar()!='\n') 
    continue; 
} 

Кроме того, вы, возможно, пожелает заменить

scanf(" %s", string); 

с

fgets(string,25,stdin); 
/* Use 26 if you actually wish to have max 25 characters 
* ie char string[26]={'\0'} 
*/ 

fgets имеет то преимущество, что он может считывать пробелы и символ новой строки '\n', и он автоматически обрезает выход в случае переполнения.

+0

Ваше решение сработало. спасибо alot – Shango

+0

@diabai: Пожалуйста, взгляните на добавление, которое я только что сделал. – sjsam

+0

Я только что увидел его, спасибо много снова. Я забыл сказать, что o в scanf («o% c», & out) для out - это просто первая буква, которую нужно прочитать, чтобы определить тип метода вывода, который я хочу вызвать. – Shango

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