C:int函数返回错误的值

时间:2015-10-19 21:45:28

标签: c return

我查看了类似的问题,但未找到合适的答案。

我正在实现一个应该读取大量数据的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;
}

我的问题是&gt;当return 1或其他任何内容出现在代码中时,它会打印出一些随机数。

2 个答案:

答案 0 :(得分:3)

您的isdiv3函数包含一个导致此返回语句的控制路径

 return sum + isdiv3(s, sum);

显然,一般情况下,此控制路径既不返回0也不返回1。这显然是你所观察到的。

答案 1 :(得分: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);,在这种情况下,返回值始终为01

BTW #define ONE 1等内容很垃圾,只需在代码中使用10