2015-05-30 44 views
0

iam新增了c程序,並且在調試程序時面臨困難。在下面的代碼中,測試用例2未運行。我發現錯誤在第二個測試用例中讀取整數n。請HEP我這個issue.Also請給我推薦了一些工具,可以爲UED調試使用terminal.Thanks C程序的幫助測試用例未在c程序中運行

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

int read(){ 
    int r = 0; 
    char c = getchar_unlocked(); 
    while(c >= '0' && c <= '9'){ 
     r = r*10 + c - 48 ; 
     c = getchar_unlocked(); 
    } 
    return r; 
} 

void main(){ 
    int t = 0; 
    t = read(); 
    int rr = 0; 
    for(rr = 0;rr < t;rr++){ 
     int i,n = 0; 
     n = read(); 
     int *p = (int *)calloc(n,sizeof(int)); 
     for(i = 0;i < n;++i){ 
     *(p+i) = getchar_unlocked() - 48; 
     } 
     int no,nz = 0; 
     for(i = 0;i < n;++i){ 
     if(*(p+i) == 0){nz += 1;} 
     if(*(p+i) == 1){no += 1;} 
     } 
     int k = 0; 
     if(((no)%2 == 0) && ((nz)%2) == 0){ 
     k = -1; 
     } 
     if(((no)%2 == 0) && ((nz)%2) == 1){ 
     k = 0; 
     } 
     if(((no)%2 == 1) && ((nz)%2) == 0){ 
     k = 1; 
     } 
     if(((no)%2 == 1) && ((nz)%2) == 1){ 
     k = 1; 
     } 
     int result = 0;printf("%d\n",5556); 
     if(k == 1){ 
     for(i = 0;i < n;++i){ 
      if(*(p+i) == 1){ 
       result = i+1 ; 
       break; 
      } 
     } 

     } 
     if(k == 0){ 
     for(i = 0;i < n;++i){ 
      if(*(p+i) == 0){ 
       result = i+1 ; 
       break; 
      } 
     } 
     } 
     printf("%d\n",result); 
    } 
} 
+0

什麼是測試案例2?你在使用什麼平臺? –

+0

iam使用gcc linux,我實現了使用for循環的測試用例。其中testcase 2表示for循環的第二次迭代。 –

+3

你的輸入和預期輸出是什麼?你可以使用'gdb'在linux中進行調試。 –

回答

1

你的策略來讀取一個整數是有缺陷的。你沒有邏輯來跳過空格。我將在功能名稱更改爲read_int並改變其實施

int read(){ 
    int n; 
    if (scanf("%d", &n) != 1) 
    { 
     // Deal with the error 
    } 
    return n; 
} 

另外,更改

*(p+i) = getchar_unlocked() - 48; 

*(p+i) = read_int(); 

或更直觀的版本:

p[i] = read_int(); 

隨着這些變化,我可以閱讀和處理這些數字。但我仍然得到錯誤的輸出。我會讓你確定你的代碼中的邏輯錯誤。

附加評論

main有望返回int。如果你的編譯器沒有抱怨,現在是時候提高警告水平。我默認使用-Wall

當您正在調試代碼的過程中,測試讀取輸入的代碼以確保讀取輸入時沒有錯誤總是很好。

這裏就是我做你的代碼:

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

int read_int(){ 
    int n; 
    if (scanf("%d", &n) != 1) 
    { 
     // Deal with the error. 
    } 
    return n; 
} 

int main(){ 
    int t = 0; 
    int rr = 0; 

    t = read_int(); 
    printf("t = %d\n", t); 

    for(rr = 0;rr < t;rr++){ 
     int i,n = 0; 

     n = read_int(); 
     printf("n = %d\n", n); 

     int *p = (int *)calloc(n,sizeof(int)); 
     for(i = 0;i < n;++i){ 
     p[i] = read_int(); 
     printf("p[%d] = %d\n", i, p[i]); 
     } 

     int no,nz = 0; 
     for(i = 0;i < n;++i){ 
     if(*(p+i) == 0){nz += 1;} 
     if(*(p+i) == 1){no += 1;} 
     } 

     int k = 0; 
     if(((no)%2 == 0) && ((nz)%2) == 0){ 
     k = -1; 
     } 
     if(((no)%2 == 0) && ((nz)%2) == 1){ 
     k = 0; 
     } 
     if(((no)%2 == 1) && ((nz)%2) == 0){ 
     k = 1; 
     } 
     if(((no)%2 == 1) && ((nz)%2) == 1){ 
     k = 1; 
     } 

     int result = 0; 
     // printf("%d\n",5556); 
     if(k == 1){ 
     for(i = 0;i < n;++i){ 
      if(*(p+i) == 1){ 
       result = i+1 ; 
       break; 
      } 
     } 

     } 

     if(k == 0){ 
     for(i = 0;i < n;++i){ 
      if(*(p+i) == 0){ 
       result = i+1 ; 
       break; 
      } 
     } 
     } 
     printf("%d\n",result); 
    } 

    return 0; 
} 
+0

,不要從calloc()和函數系列轉換返回的值。始終檢查(!= NULL)calloc()和函數系列的返回值,以確保操作成功 – user3629249

相關問題