2012-05-10 57 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

运行它通过一个调试器,然后回到这里,如果你不明白发生了什么。如果你在Linux上,我会推荐GDB ... –

+0

@Prabin你为什么要输入'ch'作为整数类型?您稍后需要该号码进行进一步处理吗?如果否,那么使用'int'解析非严格整数输入可能不是最好的解决方案。如果你需要'switch-case'以外的值,那么将输入字符/字符串作为选项,然后在正确输入的情况下提取整数值?在任何情况下,我强烈建议在可能的非数字输入情况下不要使用_only_“int”类型输入。 – penelope

回答

-2

使用scanf ("%*[^\n]\n");

在这里,你已经使用的scanf( “%d”,& CH);它将正确读取整数值,但只要您给出除整数之外的任何值,它将终止或显示不同的输出。 Why this is happening ? @它happning因为每次你进入关于scanf函数的一些值有效或无效首先它发生在输入缓冲区读写器进行阅读该值后..

如需进一步信息: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'代表输入键。每次输入后会发生什么:nothing,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语句内进行检查。

我还添加了一个解析字符的非错误案例,以便您可以看到该示例。

另外一个说明:您的旧代码应该同时接受011作为一个有效的选择,而新代码将解析01作为两个不同的选择(1个选择== 1个字符):

  • 0会被解析为一个错误的选择
  • 1会被解析为一个正确的选择。情况1

我也谈到一些其他的事情与Y我们的代码中的代码评论在更正后的代码片段中。如果像Jerry Coffin在评论中指出的那样,我拿出了“不可能的”,并把它放在一个更合适的位置,用一个有意义的东西代替常量。

+0

现在你宠坏了所有的乐趣:-) –

+0

至少在大多数系统(其中CHAR_MAX = 127或255)与32767的比较不可能是真实的。 –

+0

@Fredrik这是真的,我通常不回答这种类型的问题与代码回复......今天感觉特别好:) – penelope