2016-01-20 54 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'。 –

相關問題