C: int function returns 错误值

C: int function returns wrong value

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

我正在实现一个应该读取大量数字(存储在 char* 中)的 C 代码,并检查它是否可以被 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] = '[=11=]';

  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 或代码中的任何其他内容时,它怎么可能打印出一些随机数。

您的 isdiv3 函数包含通向此 return 语句的控制路径

 return sum + isdiv3(s, sum);

显然,在一般情况下,此控制路径 return 既不是 0 也不是 1。显然,这正是您所观察到的。

您的代码不会打印 "random number",它会打印您 return 编辑的值。

return 语句的顺序(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

so ,向后计算,值 returned 是 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 语句是 return isdiv3(s, sum); 在这种情况下 return 值将永远是 01.

顺便说一句,#define ONE 1 等都是垃圾,只需在代码中使用 10