2016-01-20 59 views
1

有一个问题,它采用了no的情况,并且在每种情况下它不采用:of对象,每个对象都是点或圆或线段。我写了完整的代码,但开关箱不工作。任何建议表示赞赏。C中的字符输入和切换大小写有误吗?

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

int main() 
{ 
    int test,nob,ans[4],px,py,cx,cy,cr,lx1,ly1,lx2,ly2,flag,i,j; 
    char type; 

    scanf("%d",&test); //no:of test cases 

    while(test) { 

     flag=0; 
     scanf("%d",&nob); //no:of objects 
     while(nob) 
     { 
      scanf("%c\\n",&type); //what type of object 
      switch(type) 
      { 
      case 'p': 
       { 
        scanf("%d%d",&px,&py); 
        if((px<=ans[0] && py<=ans[1] && px>=ans[2] && py>=ans[3])|| flag==0) { 
         ans[0]=px;ans[1]=py;ans[2]=px;ans[3]=py; 
        } 
        break; 
       } 
      case 'c': 
       { 
        scanf("%d%d%d",&cx,&cy,&cr); 
        if((cx-cr<=ans[0] && cy-cr<=ans[1] && cx+cr>=ans[2] && cy+cr>=ans[3])|| flag==0) { 
         ans[0]=cx-cr;ans[1]=cy-cr;ans[2]=cx+cr;ans[3]=cy+cr; 
        } 
        break; 
       } 
      case 'l': 
       { 
        scanf("%d%d%d%d",&lx1,&ly1,&lx2,&ly2); 
        if((lx1<=ans[0] && ly1<=ans[1] && lx2>=ans[2] && ly2>=ans[3])|| flag==0) { 
         ans[0]=lx1;ans[1]=ly1;ans[2]=lx2;ans[3]=ly2; 
        } 
        break; 
       } 
      default: 
       printf("you entered wrong letter."); 
      } 
      flag=1; 
      nob--; 
     } 
     for(i=0;i<4;i++) 
     { 
      printf("%d ",ans[i]); 
     } 
     printf("\n"); 
     test--; 
    } 
    return 0; 
} 

当您运行此程序时,switch case不起作用。我认为在输入字符的时候会出现问题。请帮助我。我一直在试图解决这个错误3天。

+1

的回答解释了故障,但也应'flag'当错误项引起了'default'情况下'nob'不能设置? –

+0

@风向标,我很抱歉..我不明白你问了什么。 – harry

+1

我在'switch'语句后修改'flag'和'nob'。但是如果输入无效,导致'default:'情况,你是否还想要这两个可变更新?如果没有,将它们移到其他单个(成功)'case'语句中的每一个。查看答案的更新。 –

回答

3

必须有一个空间之前%c - 也没有在这里需要\\n

scanf(" %c", &type); //what type of object 

否则,newline从以前scanf()type读入(这是没有必要(\n)为%d)。

您还需要定义ans

int ans[4] = {0}; 

而且j不使用 - 可以去除:

'j' : unreferenced local variable 

而且,Weather Vane提到,在恶劣的输入的情况下typeflagnob不应该更新。你可以解决这个问题如下:

default : 
    printf("you entered wrong letter."); 
    continue; 
} 
flag=1; 
nob--; 
+0

这是非常有帮助和完全纠正我的代码。你可以解释为什么我们应该在%c之前保留空格。 – harry

+1

'%c'之前的空格消耗了输入缓冲区中的所有前导空白。在你的情况下,它是'%d'输入后留下的'newline'。它不需要'%d'或'%s'或其他类型的自动消耗前导空格的类型。我讨厌'scanf'。 –

+1

@harry - 对于前一个'scanf()'为'nob',必须按回车才能结束扫描。问题是输入的换行符仍然在缓冲区中,而扫描单个字符的下一个'scanf()'将首先在输入中读取。所以'type'将具有值'\ n'。 –

相关问题