2015-10-19 3 views
-1

Я просмотрел похожие вопросы, но не нашел подходящего ответа.C: функция int возвращает неправильное значение

Я внедрения кода C, который должен прочитать большое количество (хранится в char*), и проверить, если его делится на 3.

Программа отлично работает, он печатает правильный ответ (вы увидите printf в функции, которая работает так, как они должны)

Я даже попытался определить 1 и 0 и вернуть его таким образом, но он по-прежнему не работает.

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

#define ONE 1 
#define ZERO 0 

int isdiv3(char* s, int sum) 
{ 
    /*if string is empty, then check if sum until that point is divisible by 3*/ 
    if(strlen(s) == 0) { 
     if((sum % 3) == 0) { 
      printf("yes %d\n", sum); 
      return ONE; 
     } 
     else{ 
      printf("no %d\n", sum); 
      return ZERO; 
     } 
    } 

    if(strlen(s) == 1) 
    { 
     if(!strcmp(s, "3") || !strcmp(s, "6") || !strcmp(s, "9")) 
     { 
      return ONE; 
     } 
    } 

    int temp = s[strlen(s) - 1] - '0'; 
    sum += temp; 
    s[strlen(s) - 1] = '\0'; 

    return sum + isdiv3(s, sum); 
} 

int main() 
{ 
    int x; 

    char str[200] = "123456"; 
    char *s = malloc(sizeof(char) * 7); 
    strcpy(s, str); 

    x = isdiv3(s, 0); 

    if(x == 1) 
     printf("%s is divisible by 3\n", str); 
    else 
     printf("%s is not divisible by 3\n", str); 

     printf("x %d\n", x); 
//prints x 92 

    return 0; 
} 

Мой вопрос> как это возможно, что когда return 1 или что-нибудь еще в коде, он печатает некоторое случайное число.

+0

** char * s = malloc (sizeof (char) * 7); ** Возможно, вы будете ** бесплатно ** это когда-нибудь. – Michi

+0

Я не копировал весь код, он был освобожден в конце, но я забыл поместить его здесь. Спасибо за ваш комментарий! – Rorschach

ответ

1

Ваш код не печатает «случайное число», он печатает возвращаемое вами значение.

Последовательность возвращения заявления (с sum заменяется его значением в то время) является:

return 6 + isdiv3("12345", 6) 

    return 11 + isdiv3("1234", 11) 

     return 15 + isdiv3("123", 15) 

      return 18 + isdiv3("12", 18) 

       return 20 + isdiv3("1", 20) 

        return 21 + isdiv3("", 21) 

         return 1 

так, работая в обратном направлении, возвращенное значение 1 + 21 + 20 + 18 + 15 + 11 + 6, который работает до 92, как вы видите.

Если вы все еще не уверены, то замените return заявление с:

int r = isdiv3(s, sum); 
printf("return %d + %d\n", sum, r); 
return sum + r; 

Я думаю, что вы имели в виду ваше возвращение заявление, чтобы быть return isdiv3(s, sum); в этом случае возвращаемое значение всегда будет 0 или 1.

BTW #define ONE 1 и т. Д. Это мусор, просто используйте 1 и 0 в вашем коде.

3

Ваша isdiv3 функция содержит путь управления, что приводит к этому оператора возврата

return sum + isdiv3(s, sum); 

Очевидно, что в общем случае этот путь управления возвращает ни 0, ни 1. По-видимому, это именно то, что вы наблюдаете.

+0

Я это знаю, но в последнем прохождении через 'isdiv3' он входит в первое условие' if', и значение должно быть возвращено оттуда. – Rorschach

+0

Да, но это значение 0 или 1 (макросы не имеют значения) передается обратно на вызов, который возвращает 'sum + isdiv3 (s, sum)', а затем *, который * (в конечном итоге) возвращается к 'main' , – Kninnug

+0

@ user3735245: Я не знаю, что означает «окончательный переход», о котором вы говорите. Но ваша функция рекурсивна. Его «окончательная передача» - это самый внешний рекурсивный вызов. И он проходит через 'return sum + isdiv3 (s, sum)', а не через любой из '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Результат самой внешней 'return sum + isdiv3 (s, sum)' - это то, что вы видите в своем 'x'. – AnT

Смежные вопросы