2013-08-06 2 views
2
#include <stdio.h> 
#include <stdlib.h> 

int main() 

{ 

    char a,b; 

    printf("enter the firstkeyword \n"); 
    a = getchar(); 
    printf("enter your second keyword \n"); 
    b = getchar(); 

    if(a>b) 
    { 
    printf("it is '%c' greater than '%c' as i expected \n",a,b); 
    } 
    else if (b>a) 
    { 
    printf("here'%c'is greater than '%c' \n",b,a); 
    } 
    else 
    { 
    printf("dont type the same character twice in next session \n"); 
    } 
    return(0); 

} 

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

введите первый ключевой

я вписал '$' и использовал Ctrl + Z, чтобы ВФ и 'Enter', чтобы продолжить программа. Но даже без ввода второго ключевого слова, компилятор печать вывод, как

введите ваше второе ключевое слово

это «$» больше «->», как я ожидал

Может кто-нибудь помочь с этой программой?

Извините, если какие-либо грамматические или фразовые ошибки.

+0

Пожалуйста, включите все предупреждения компилятора и научиться использовать отладчик (на Linux: скомпилировать с 'gcc -Wall -g', отладить с помощью' gdb'). –

+0

@chintusrikanth следующий символ, который читается, '' \ n'', потому что вы также нажимаете enter – tay10r

+0

@BasileStarynkevitch: Вы заметили какие-либо ошибки в источнике OP? – alk

ответ

5

getchar() принимает дополнительные входы \n тоже при нажатии enter, которая до сих пор существует в buffer.You нужно, чтобы поглотить этот дополнительный символ, чтобы второй getchar work.Try вызова getchar дважды как

ценам ниже
char just_to_consume; 
a = getchar(); 
just_to_consume = getchar(); 
printf("enter your second keyword \n"); 
b = getchar(); 
just_to_consume = getchar(); 

кроме выше опции вы можете использовать стандартную функцию setvbuf контролировать буферизацию.Еще один вариант (лично я не предпочитаю этого избегать неопределенного поведения) использует fflush(stdin)

+0

спасибо за многообещающий rai ... если вы не возражаете, можете ли вы объяснить это более кратко ??? что мы можем сделать, если имеется более двух ключевых слов ввода номера, есть ли какая-либо комбинация клавиш для уменьшения длины кодирования? На самом деле, я изучаю c из «c из манекенов», в этой книге они упоминали, что использование eof типа ctrl + z (страница № 169 в c для чайников) может запускать программу, но это не сработало. Можете ли вы рассказать мне причину bro ?? –

+0

Возможно [setvbuf] (http://www.gnu.org/software/libc/manual/html_node/Controlling-Buffering.html) и [что действительно делает getchar] (http://stackoverflow.com/questions/3676796/what-do-getchar-exact-do). Сокращение длины кодирования зависит от практики, выбора определения, оптимизации и, конечно, от опыта. Не нужно быть в спешке. 'ctrl + z' для EOF, но я могу " не вижу никакого использования этого в вашем коде. Посмотрите [здесь] (http://stackoverflow.com/questions/16132971/how-to-send-ctrlz-in-c) –

+0

поблагодарить u @Dayal rai. я позабочусь об остальном –

2

Проблема в том, что ваша новая строка получает буферизацию и передается на следующий вызов getchar. Вы должны иметь дело с буферном новой строки в возможно следующим образом:

printf("enter the firstkeyword \n"); 
scanf(" %c", &a); 

printf("enter your second keyword \n"); 
scanf(" %c", &b); 

Пространство перед тем %c является общей идиомы, который говорит scanf игнорировать любое пространство до следующего символа, который в нашем случае также включает в себя символ новой строки. Это не обязательно в первом случае в данном конкретном случае, но жизненно важно во втором.

Вы также не нуждаетесь в stdlib включают и вы можете return без скобок, как return 0;

На самом деле, если вы чувствуете, как экспериментировать, и вы на терминале Linux, вы можете установить терминал в raw mode который удалит все возможности буфера и синтаксического анализа, которые терминал предоставит вам. Для этого запустите /bin/stty raw в терминале.

Таким образом не будет буферизации, и вам не придется беспокоиться о каких-либо буферизованных символах новой строки. Выход на консоли будет выглядеть смешно, хотя (я вошел сюда a и b), если вы не регулировать, что с размещением стратегически возврат каретки (\r):

$ ./a.out 
     enter the firstkeyword 
           aenter your second keyword 
                 bhere'b'is greater than 'a' 

Я использовал исходный код вышесказанное.

Чтобы восстановить его, просто запустите /bin/stty cooked

+0

извините nobilis .. опция scanf не сработала ... –

+0

@chintusrikanth Что не сработало? В моем случае новая линия не получает переходят к следующему вызову, и я могу получить следующий вывод: 'ввести firstkeyword б ввести ваше второе ключевого слова это«б»больше чем" a ', как я ожидал ' – Nobilis

+0

Извините @Nobilis, я использую orwell devC++. если вы можете сказать мне, что для dev C++ в Windows заранее спасибо –

0

C берет '\ n' как второй символ. Что вы можете сделать, это ввести как символ в той же строке,

$ @

либо модифицировать программу, не используя GetChar функции()

char a,b; 
printf("enter the firstkeyword \n"); 
scanf(" %c",&a); 
printf("enter your second keyword \n"); 
scanf(" %c",&b); 

Обратите внимание на белом пространстве между " и % с

Это делает трюк.

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