c程序中的测试用例不是运行

testcase not running in c program

我是c程序的新手,调试困难programs.In下面的代码测试用例2不是running.I在第二个测试中发现错误是在读取整数n case.someone 请帮助我 issue.Also 请向我推荐一些可用于调试 c 程序的工具 terminal.Thanks 寻求帮助

#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);
   }
}

您读取整数的策略存在缺陷。您没有跳过空格的逻辑。我会将函数名称更改为 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 预计 return 和 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;
}