函数更改输出中的 strlen
strlen in a function changing output
好吧,我想弄明白,但没弄清楚;
所以我的源代码中有一个函数传递了两个参数(9 和 1,作为字符串)
char * plus( char *a, char *b ){
char sa[101] = {0};
char sb[101] = {0};
static char _s[101] = {0};
int i;
int st = 0;
int sto;
for( i = strlen( a ) - 1; i >= 0; i-- ){
sa[strlen( a ) - 1 - i] = a[i];
}
for( i = strlen( b ) - 1; i >= 0; i-- ){
sb[strlen( b ) - 1 - i] = b[i];
}
for( i = 0; i < strlen( sa ); i++ ){
sto = 0;
if(( sa[i] + sb[i] + st - 2 * '0' ) > 9 ) sto = 1;
sa[i] = ( sa[i] + sb[i] + st - 2 * '0' ) %10 + '0';
st = sto;
if( st && sa[i + 1] == 0) sa[i + 1] = '1';
}
for( i = strlen( sa ) - 1; i >= 0; i-- ){
_s[strlen( sa ) - 1 - i] = sa[i];
}
return _s;
}
它应该 return“10”而不是“*0”,但始终如此(所以不是 "undefined behaviour")
怎么了?
编辑:
如果我在行 for( i = 0; i < strlen( sa ); i++ ){
中传递 strlen( a )
而不是 strlen( sa )
然后它可以正常工作
sa[i] + sb[i] + st - 2 * '0'
是否定的。因为你做 sa[i + 1] = '1'
然后 strlen(sa)
get 在循环中递增。因此,sb[i]
等于 0,因为它是 i == strlen(sa) == 2
时最后一个 运行 的零终止字符。那么计算就变成了:
sa[i] + sb[i] + st - 2 * '0' =
'1' + 0 + 1 - 2 * '0' =
49 + 0 + 1 - 2 * 48 =
50 - 96 =
-46
因为那是负 46,所以 sa[i] 变成:
a[i] = ( sa[i] + sb[i] + st - 2 * '0' ) %10 + '0' =
-46 %10 + '0' =
-6 + '0' =
'*'
最有可能在循环中:
for( i = 0; i < strlen( sa ); i++ ){
你必须注意当字符串长度不相等时会发生什么。你做了 sa[i] = '1'
,但 sb
保持不变。我想现在你可以通过替换
来修复它
sa[i] + sb[i] + st - 2 * '0'
附带一些东西:
sa[i] - '0' + (sb[i] ? sb[i] - '0' : '0') + st
注意:我不喜欢你的缩进。请使您的代码尽可能可读。使用换行符来表示新的表达式。使用 {
}
来表示您进入循环或 if bodies 的位置。
这个循环
for( i = 0; i < strlen( sa ); i++ ){
sto = 0;
if(( sa[i] + sb[i] + st - 2 * '0' ) > 9 ) sto = 1;
sa[i] = ( sa[i] + sb[i] + st - 2 * '0' ) %10 + '0';
st = sto;
if( st && sa[i + 1] == 0) sa[i + 1] = '1';
}
是不正确的,因为在循环中数组 sa
正在被更改。因此,在每次迭代中计算的 strlen( sa )
返回的值也发生了变化。
当您使用 strlen( a )
而不是 strlen( sa )
时,数组 s 在循环中不会改变。所以表达式返回的值是固定的。
好吧,我想弄明白,但没弄清楚;
所以我的源代码中有一个函数传递了两个参数(9 和 1,作为字符串)
char * plus( char *a, char *b ){
char sa[101] = {0};
char sb[101] = {0};
static char _s[101] = {0};
int i;
int st = 0;
int sto;
for( i = strlen( a ) - 1; i >= 0; i-- ){
sa[strlen( a ) - 1 - i] = a[i];
}
for( i = strlen( b ) - 1; i >= 0; i-- ){
sb[strlen( b ) - 1 - i] = b[i];
}
for( i = 0; i < strlen( sa ); i++ ){
sto = 0;
if(( sa[i] + sb[i] + st - 2 * '0' ) > 9 ) sto = 1;
sa[i] = ( sa[i] + sb[i] + st - 2 * '0' ) %10 + '0';
st = sto;
if( st && sa[i + 1] == 0) sa[i + 1] = '1';
}
for( i = strlen( sa ) - 1; i >= 0; i-- ){
_s[strlen( sa ) - 1 - i] = sa[i];
}
return _s;
}
它应该 return“10”而不是“*0”,但始终如此(所以不是 "undefined behaviour") 怎么了?
编辑:
如果我在行 for( i = 0; i < strlen( sa ); i++ ){
中传递 strlen( a )
而不是 strlen( sa )
然后它可以正常工作
sa[i] + sb[i] + st - 2 * '0'
是否定的。因为你做 sa[i + 1] = '1'
然后 strlen(sa)
get 在循环中递增。因此,sb[i]
等于 0,因为它是 i == strlen(sa) == 2
时最后一个 运行 的零终止字符。那么计算就变成了:
sa[i] + sb[i] + st - 2 * '0' =
'1' + 0 + 1 - 2 * '0' =
49 + 0 + 1 - 2 * 48 =
50 - 96 =
-46
因为那是负 46,所以 sa[i] 变成:
a[i] = ( sa[i] + sb[i] + st - 2 * '0' ) %10 + '0' =
-46 %10 + '0' =
-6 + '0' =
'*'
最有可能在循环中:
for( i = 0; i < strlen( sa ); i++ ){
你必须注意当字符串长度不相等时会发生什么。你做了 sa[i] = '1'
,但 sb
保持不变。我想现在你可以通过替换
sa[i] + sb[i] + st - 2 * '0'
附带一些东西:
sa[i] - '0' + (sb[i] ? sb[i] - '0' : '0') + st
注意:我不喜欢你的缩进。请使您的代码尽可能可读。使用换行符来表示新的表达式。使用 {
}
来表示您进入循环或 if bodies 的位置。
这个循环
for( i = 0; i < strlen( sa ); i++ ){
sto = 0;
if(( sa[i] + sb[i] + st - 2 * '0' ) > 9 ) sto = 1;
sa[i] = ( sa[i] + sb[i] + st - 2 * '0' ) %10 + '0';
st = sto;
if( st && sa[i + 1] == 0) sa[i + 1] = '1';
}
是不正确的,因为在循环中数组 sa
正在被更改。因此,在每次迭代中计算的 strlen( sa )
返回的值也发生了变化。
当您使用 strlen( a )
而不是 strlen( sa )
时,数组 s 在循环中不会改变。所以表达式返回的值是固定的。