2014-10-03 2 views
0

Это часть университетской лаборатории, и TA сообщает мне, что есть ошибка, но у меня нет подсказки. Когда я запускаю его, он спрашивает меня о первом char, но затем проходит через программу и не спрашивает меня на втором scanf.Ошибка в простой программе

#include <stdio.h> 

int main(void) { 
    char sen, ben; 

    printf("Type in a character: "); 

    scanf("%c", &sen); 
    printf("The key just accepted is %d", sen); 

    printf("\nType in another character: "); 
    scanf("%c", &ben); 
    printf("The key just accepted is %d", ben); 
} 
+2

Это не совсем C++. Вернее, вы ничего не используете из C++. –

+0

Что такое? Во время моих лекций мой профессор использует только void main, но это тоже неверно, верно? – Dale

+1

'' \ n'' считается еще одним символом и потребляется с помощью 2. 'scanf()'. –

ответ

-1

это потому, что никто не принимает '\n'. звоните scanf вот так scanf("%c%*c", &sen). %*c означает, что вы хотите опустить один символ, который равен '\n'.

btw, void main() разрешено. Функция main не является реальной точкой входа исполняемого файла, поэтому это нормально. но, похоже, не всем это нравится.

+1

Что значит «btw, void main() разрешено. Основная функция - не настоящая точка входа исполняемого файла»? –

+0

@AlexM .: Прочитайте [Что должно быть 'main()' return in C и C++] (http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c/18721336 # 18721336). Microsoft C явно разрешает 'void main()' в Windows; это нестандартное расширение. Утверждение «разрешено» слишком радикально, но за ним стоит самородок правды, хотя и очень раздражающий. –

+0

Мой вопрос больше относится к "main function is not the real entry point of executable" –

1

На самом деле это C не C++. Сохраните его как file.c. Попробуйте это:

#include <stdio.h> 

int main(void) { 
    char sen, ben; 
    printf("Type in a character: "); 
    sen = getchar(); 
    printf("The key just accepted is %d", sen); 
    printf("\nType in another character: "); 
    getchar(); 
    ben = getchar(); 
    printf("The key just accepted is %d", ben); 
} 

Пояснение: при вводе первого символа и нажмите клавишу ВВОД он принимает ввести «s ASCII код в качестве второго. Предлагаю не использовать scanf. Но он работает в обоих направлениях, если вы положили getchar, чтобы «взять» вход.

1

Добавление пробела до %c во втором scanf решит проблему.

Это делается потому, что scanf не потребляет \n символа после ввода первого символа и оставляет его в stdin .Каке клавиш ввода (\n) также характер, он получает потребляются следующим scanf call.The перед %c отбросит все пробелы, такие как пробелы.

При сканировании символа (%c) с использованием scanf, добавьте пробел до %c, так как это поможет уменьшить путаницу и помочь вам. Поэтому, как в scanf с, вы можете добавить пространство.

0

Когда вы нажмете клавишу и нажмите «Ввод», вы набрали две клавиши. Первым был желаемый ключ, например, a, а второй был ключ <enter>, обычно записанный как \n. Итак, ваш второй scanf отображает результат \n.

Поскольку распечатка символа \n не приводит к чему-то, что легко увидеть на экране, оно будет выглядеть так, как будто ваша программа просто пропускает второй scanf и распечатывает только фиксированные части printf без возможности видимое значение.

Один из способов обойти эту проблему состоит в том, чтобы потреблять все нажатия клавиш перед клавишей, который вы хотите захватить. Это делается путем принятия большего ввода после символа до тех пор, пока вы не увидите символ новой строки \n. Как только вы увидите этого персонажа, вы выполните следующее.

// flush extra input up the to carriage return 
char flush = 0; 
while (flush != '\n') { 
    scanf("%c", &flush); 
} 

// now read my desired input 
scanf("%c", &ben); 
Смежные вопросы