2015-01-11 3 views
0

У меня проблема с вводом для калькулятора с надписью с пометкой в ​​C. . Мой учитель попросил меня использовать scanf («% s», токен), чтобы получить вход. Чтобы остановить чтение токенов, я проверяю, является ли значение, возвращаемое scanf, EOF. Он работает, если я использую перенаправление ввода при тестировании, но если я напишу выражение на CMD Windows, я попаду в бесконечный цикл. Как я могу остановить scanf, когда я просто нажимаю клавишу ввода без ввода строки? Вот код:Чтение выражений для калькулятора с надписью с фиксированным числом с помощью scanf

#include <stdio.h> 
#include <ctype.h> 
#include "stack.h" 

int main(){ 
    int a,b,t,stop; 
    char token[10],c; 
    do{ 
     stop = scanf("%s",token); 
     if (stop == EOF){ 
      break; 
     } 
     if (isdigit(token[0])){ 
      t = atoi(token); 
      push(t);  
     }else{ 
      a = top(); 
      pop();  
      b = top(); 
      pop(); 
      c = token[0]; 
      switch(c){ 
      case '+': t = a + b; 
         break; 
      case '-': t = a - b; 
         break; 
      case '*': t = a * b; 
         break; 
      case '/': t = a/b; 
         break; 
      } 
      push(t); 
     } 
    } while(1); 
    printf("Result: %d\n",top()); 
} 

Проблема заключается в, если блок после остановки переменной inizialisation, я думаю. Извините за мой английский, я итальянский студент, я старался быть настолько аккуратным, насколько смогу.

+2

'Ctrl + z' введите для' EOF' – BLUEPIXY

+0

@BLUEPIXY или 'Ctrl + d' –

+0

@iharob его системы' Окна cmd' (его запись) – BLUEPIXY

ответ

0

«Как остановить сканирование, когда я просто нажимаю клавишу ввода без ввода строки?»

Использование scanf() для чтения '\n' (Ввод) является сложной задачей. fgets() или fgetc() - лучший подход. Но следующее показывает, как почти сделать это с scanf().

%s в scanf("%s",token); сначала потребляет ведущее белое пространство, включая '\n'. Код должен сначала обнаружить любой потенциал '\n' перед вызовом scanf("%s",token);.

char ws[2]; 

// Consume white-space, but not \n 
scanf("%*[ \f\r\t\v]"); // Depending on locale, this may not be a complete list 
if (1 == scanf("%1[\n]", ws) { 
    break; 
} 

stop = scanf("%s",token); 
if (stop == EOF){ 
    break; 
} 

уборщик способ сделать это.

int ch; 
while (isspace(ch = fgetc(stdin)) && ch != '\n'); 
if (ch == '\n') { 
    break; 
} 
ungetc(ch, stdin); 

stop = scanf("%s",token); 
if (stop == EOF){ 
    break; 
} 
0

Только еще один вопрос: остановить программу, я должен был ввести CTRL + Z дважды. Можешь мне сказать почему?

Обычно стандартный ввод в текстовом режиме с линейным буферизацией реализуется путем вызова функции, специфичной для системы, которая считывает строку и возвращает количество символов в ней (включая символ новой строки); когда возвращается число 0, это считается EOF. Теперь, когда вы вводите «3 5 + (crtl + z) (ctrl + z)», первый Ctrl-Z завершает входную строку и заставляет функцию чтения возвращать 5, но это не указывает EOF на стандартные функции ввода ; только после нажатия второго Ctrl-Z без промежуточного ввода 0 возвращается и распознается как EOF.