3

私はCの中間期のいくつかの基本的な機能を研究していて、インストラクターの例を間違ってコピーしたことに気づきました。私はおそらく今これを考えるのに疲れすぎているので、少し押していただければ幸いです。

void replace_last(char s[], int oldc, int newc){
    size_t i, pos-1; /* I have no idea why I wrote pos-1. I know I need it though */
        for(i = 0; s[i] != '\0'; i++){
             if(s[i] == oldc)
                 pos == i;
             if(pos != -1)
                 s[pos] = newc;
         }
}
4

3 に答える 3

2

Ist ifステートメントの内部では、それを実行pos==iする必要がありますpos=i

pos==iは条件文であり、pos = i割り当てであるため

void replace_last(char s[], int oldc, int newc){
    size_t i, pos=-1; /* I have no idea why I wrote pos-1. I know I need it though */
        for(i = 0; s[i] != '\0'; i++){
             if(s[i] == oldc)
                 pos = i;
             if(pos != -1)
                 s[pos] = newc;
         }
}

の位置を見つけてからの値を変更することで、oldcを置き換えたいと思います。同じ反復で、wtihを置き換えます。newcoldcposs[pos]=newoldcnewc

コードは今は問題ありません。実行するか、ドライランして確認できます。

于 2012-10-26T06:03:29.867 に答える
2

行番号:5 は次pos==iのように置き換える必要がありますpos=i

于 2012-10-26T06:08:19.480 に答える
1
void replace_last(char s[], int oldc, int newc){
   size_t i, pos = -1;
   for(i = 0; s[i]; i++)
      if(s[i] == oldc)
         pos = i;
   if(pos != -1)
      s[pos] = newc;
}

したがって、コピーしたコードには3つの問題がありました。 pos-1、、pos == iそして3番目に、ロジックはループの外側if(pos != -1) s[pos] = newc;にある必要があります。

編集:答えをまとめるために、これを行う「非手動」の方法は、たとえば次のようになります。

void replace_last(char s[], int oldc, int newc) {
   if (strrchr(s, oldc))
      *strrchr(s, oldc) = newc;
}

(必要に応じて、の戻り値をstrrchr()一時ポインターに保存して、への2回目の呼び出しを回避することもできますがstrrchr(),、これはおそらく不要です。gccwith-O1はこれを自動的に実行します。)

于 2012-10-26T06:04:35.627 に答える