2015-05-30 37 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

相关问题