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 值将永远是 0
或 1
.
顺便说一句,#define ONE 1
等都是垃圾,只需在代码中使用 1
和 0
。
我查看了类似的问题,但没有找到合适的答案。
我正在实现一个应该读取大量数字(存储在 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 值将永远是 0
或 1
.
顺便说一句,#define ONE 1
等都是垃圾,只需在代码中使用 1
和 0
。