2015-05-30 3 views
0

iam new to c program и сталкиваются с трудностями в отладке программ. В нижеприведенном тестовом примере кода 2 не работает. Я обнаружил, что ошибка заключается в чтении interger n во втором тестовом случае. пожалуйста, мне с ГПУ этим issue.Also пожалуйста рекомендовать меня с некоторыми инструментами, которые могут быть UEd для отладки программ с использованием terminal.Thanks помощиtestcase не работает в 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 и i реализованы тестовые примеры, использующие для loop.here 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

на C, не отбрасывать возвращаемое значение из calloc() и семейства функций. Всегда проверяйте (! = NULL) возвращаемое значение из calloc() и семейство функций, чтобы гарантировать успешную работу – user3629249