3
int main(int argc, char* argv[])
{
   int i,s;
   s=0;
   char*p;
   for(i=1; i<argc;i++)
   {
      for (p=argv[i];*p;p++);
      s+=(p-argv[i]);
   }
 printf("%d\n",s);
 return 0;
}

このコードが何をするのか理解するのに苦労しています。

私が見る限り、プログラムの名前は無視され、コマンドラインで出力された他のすべての文字列についてはp、現在の文字列に設定されます。

  1. 条件*pは、「pそうでない限りNULL、つまり、文字列の終わりに到達するまで移動しますか? 」と言います。
  2. 各反復で、現在の、単語の残りの部分のs減算を、の名前で合計します。この減算の結果は何ですか?これは2つのASCII値の減算ですか?pargv[i]
  3. このプログラムは基本的に何をしますか?
4

4 に答える 4

2

この質問に答える鍵は、この表現の意味を理解することです。

p-argv[i]

これはポインター減算式であり、最初のポインターと2番目のポインターの間のポインターが指す要素のサイズの距離として定義されます。これは、両方のポインタが、連続したブロックとして割り当てられたメモリ領域を指している場合に機能します(これは、一般にすべてのC文字列、argv[]特にの要素に当てはまります)。

ポインタpは最初に文字列の最後まで進み(;ループの最後にあるセミコロンに注意してください。これはループ本体が空であることを意味します)、次にargv[i]減算されます。結果は、対応する引数の長さです。

于 2012-07-17T14:07:33.903 に答える
1

このコードは、プログラムの引数の長さの合計を(文字列として)計算します

于 2012-07-17T14:07:15.573 に答える
1

プログラムに渡したすべての引数の文字列の合計の長さを示します。

あなたのポイント(2)では、文字列の開始アドレスと文字を保持するアドレスを差し引くだけ\0です

于 2012-07-17T14:08:19.617 に答える
0

すべての引数の合計文字数を計算するために、逆方向タイプの方法でポインタアドレスを使用します。

for (p=argv[i];*p;p++); //sets p to the address of argv[i]'s \0 terminator
   s+=(p-argv[i]);     // p minus the address of the start of argv[i] accumulated to s
于 2012-07-17T14:13:10.967 に答える