我查看了类似的问题,但未找到合适的答案。
我正在实现一个应该读取大量数据的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
或其他任何内容出现在代码中时,它会打印出一些随机数。
答案 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);
,在这种情况下,返回值始终为0
或1
。
BTW #define ONE 1
等内容很垃圾,只需在代码中使用1
和0
。