[英]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;
}
它應該返回“10”而不是“*0”,但不斷地,(所以不是“未定義的行為”)有什么問題?
編輯:
如果我在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's 在循環中遞增。 因此, 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 正文的位置。
這個循環
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 不會更改。 所以表達式返回的值是固定的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.