簡體   English   中英

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;
}

它應該返回“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM