2012-05-10 3 views
1

Ниже приведен код C.Странное поведение программ C

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    int ch; 

    do 
    { 
     printf("\n1.create\n2.display\n3.exit\n\t"); 
     printf("Enter your choice:: "); 
     scanf("%d",&ch); 
     printf("choice = %d\n\n", ch); 
     if(ch==32767) 
      return 0; 
     switch(ch) 
     { 
      case 1: 
       printf("\n Case 1 executed\n"); 
       break; 
      case 2: 
       printf("\nCase 2 executed\n"); 
       break; 
      case 3: 
       printf("\nExit\n"); 
       exit(0); 
       break; 
      default: 
       printf("Wrong choice!!!"); 
       break; 

     } 
    }while(ch!=3); 
    return 0; 
} 

Проблема в том, что когда я вводя целочисленное значение для ch, он работает нормально. Но когда я вводю любые символы, он работает в бесконечном цикле.

Может ли любой его решить.

+4

Run это через отладчик, а затем вернуться сюда, если вы не понимаете, что происходит. Если вы работаете в Linux, я бы рекомендовал GDB ... –

+0

@Prabin Почему вы хотите ввести «ch» в виде целочисленного типа? Вам понадобится этот номер позже для дальнейшей обработки? Если нет, то использование 'int' для разбора не строго-целочисленного ввода может оказаться не лучшим решением. Если вам нужно значение для чего-то другого, кроме 'switch-case', будет ли вводить в качестве символа/строки параметр, а затем извлечь целочисленное значение в случае правильного ввода? В любом случае я настоятельно рекомендую не использовать _only_ 'int' type для ввода в случае возможного нечислового ввода. – penelope

ответ

-2

Использование scanf ("%*[^\n]\n");

Здесь вы использовали Scanf ("% D", & ч);, который будет корректно считывать целочисленное значение, но как только вы укажете какое-либо значение, отличное от целого, оно прекратит или покажет другой вывод. Why this is happening ? @ Это happning, потому что каждый раз, когда вы ввели некоторое значение либо действительным или недействительным первое это место в считывателем буфера после этого значения, считанного оттуда ..

Для получения дополнительной информации о зсапЕ: http://en.wikipedia.org/wiki/Scanf_format_string

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    int ch; 

    do 
    { 
     printf("\n1.create\n2.display\n3.exit\n\t"); 
     printf("Enter your choice:: "); 

     scanf ("%*[^\n]\n"); 
     scanf("%d",&ch); 
     switch(ch) 
     { 
      case 1: 
       printf("\n Case 1 executed\n"); 
       break; 
      case 2: 
       printf("\nCase 2 executed\n"); 
       break; 
      case 3: 
       printf("\nExit\n"); 
       exit(0); 
       break; 
      default: 
       printf("Wrong choice!!!"); 
       break; 

     } 
    }while(ch!=3); 
    return 0; 
} 
+0

Hi Nishant, Спасибо за сообщение ответа. Я нашел проблему после запуска этого кода. Когда он запрашивает ввод, и я вставляю символ, который показывает пустой. Опять же, если я вхожу в персонаж, он работает нормально. Ты можешь починить это. – Prabin

+0

Этот код не работает. Пример: попробуйте ввести 'j1E' 'jE' '1E' 'jE', где 'E' обозначает клавишу ввода. Что происходит после каждого ввода: ничего, wrong_choice, case_1, case_1. Я не думаю, что это желаемое поведение. Я ошибаюсь? – penelope

+0

Этот ответ немного вводит в заблуждение: шаблон «% * [^ \ n]» будет отбрасывать все, прежде чем (не включая) новую строку. Если перед новой строкой ничего нет, она просто терпит неудачу, и следующий шаблон не будет выполнен. Если есть что-то перед новой строкой, оно отбрасывается, а затем выполняется «\ n», которое отбрасывает каждый пробельный символ до символа без пробелов. Если нет символа без пробелов после того, как новая строка 'scanf' будет висит, ожидая одного – IanC

2

Вы должны использовать значение char вместо int, если хотите иметь возможность обрабатывать символы.

В этом случае вы также должны изменить свой оператор switch-case, потому что '1' - символ, отличный от 1 - целое число. Исправленный код должен быть что-то вроде:

#include <limits.h> 

int main() 
{ 
    char ch; 

    do 
    { 
     printf("\n1.create\n2.display\n3.exit\n\t"); 
     printf("Enter your choice:: "); 
     scanf("%c",&ch); 
     printf("choice = %c\n\n", ch); 
     switch(ch) 
     { 
      case '1': 
       printf("\n Case 1 executed\n"); 
       break; 
      case '2': 
       printf("\nCase 2 executed\n"); 
       break; 
      // case 32767: - can not be stored in a char variable 
      case 127: 
      case CHAR_MAX: // these two are almost equivalent, but the 
          // second one is better because it relies on 
          // library defined constant from limits.h 
      case '3': 
       printf("\nExit\n"); 
       exit(0); 
       break; 
      case 'a': 
       printf("\nA character case accepted!\n"); 
       break; 
      default: 
       printf("Wrong choice!!!"); 
       break; 

     } 
    }while(); 
    return 0; 
} 

Обратите внимание, что я также исключил состояние разрыва из как while() аргумента, поскольку он является излишним - это уже будет проверено внутри switch заявления.

Я также добавил случай без ошибок для разбора символа, чтобы вы могли увидеть пример этого.

Еще одно замечание: Ваш старый код должен принять как 01 и 1 как действительный выбор, в то время как новый код будет разбирать 01 как два различных варианта (1 выбор == 1 символ):

  • 0 будет быть проанализирован как неправильный выбор
  • 1 будет анализироваться в качестве правильного выбора для случая 1

Я также комментировал некоторые другие вещи из г наш код в комментариях кода в исправленных фрагментах кода. Я вытащил «невозможное», если (как указал Джерри Коффин в комментариях) и поставил его в более подходящее место, заменив константу на что-то значимое.

+0

теперь вы испортили все самое интересное :-) –

+0

По крайней мере, на большинстве систем (где CHAR_MAX = 127 или 255) сравнение с 32767 не может быть правдой. –

+0

@Fredrik Это правда, я обычно не отвечаю на подобные вопросы с помощью кодов-ответов ... Просто чувствовал себя особенно хорошо сегодня :) – penelope

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