0

テキスト行のセットを読み取り、最も長く出力する問題を解決しています。この問題は、K&Rの「C プログラミング言語」セクション 1.9 からのものです。本は解決策を提供しますが、私は自分のやり方で解決しようとしました。以下のコードは機能しますが、機能させる前に、割り当てが完了するとインクリメントされるという考えをlongestStr[i++] = tmpStr[j++]以前に使用していたため、行が原因で問題が発生していました。しかし、そうではありませんでした。これは、後置演算子が通常どのように機能するかですか?longestStr[i++] = tmpStr[i++]i

#include <stdio.h>
#define MAXLINE 100


main()
{
    int lineLength = 0, longestLine = 0;
    int c, i, j;
    char longestStr[MAXLINE];
    char tmpStr[MAXLINE];

    while((c = getchar()) != EOF)
    {
        tmpStr[lineLength++] = c;
        if(c == '\n')
        {
            if( lineLength > longestLine)
            {
                longestLine = lineLength;
                i = 0, j = 0;
                while(i < lineLength)
                {
                    longestStr[i++] = tmpStr[j++]; // I tried longestStr[i++] = tmpStr[i++] but it gives wrong result
                }               
            }
            lineLength = 0;
        }       
    }
    printf("Longest line is - %d long\n", longestLine-1);
    for(i = 0; i < longestLine-1; i++)
        printf("%c", longestStr[i]);
    putchar('\n');
}
4

4 に答える 4

3

接尾辞のインクリメントまたはデクリメントは、変数の使用後にインクリメントまたはデクリメントを実行する演算子です。たとえば、整数値を使用して出力し、同時にそれを追加したい場合は、接尾辞を使用します。

int i = 0;
printf("%d",i++);
//prints out 0

ただし、プレフィックスのインクリメント/デクリメントは逆の方法で機能し、変数を使用する前にインクリメント/デクリメントを実行します。変数を出力する前にインクリメント/デクリメントする場合は、プレフィックスを使用します。

int i = 0;
printf("%d",++i);
//prints out 1
于 2013-06-30T07:03:52.833 に答える
1

修正後のインクリメントがどのように機能するかを理解してください。

f(i++) は、「i の現在の値に対して f を呼び出し、i をインクリメントする」操作と同等です。

たとえば、i++ を 2 回使用した場合、 の初期値はi = 1a(i++) = b(i++)意味a(1)=b(2)し、演算後の i の値は ですi=3

実行しようとしている変数を 1 つ削除したい場合は、インクリメントを 1 回だけ使用するようにする必要があります。好きにして、a(i)=(b(i); i++

于 2013-06-30T07:07:43.800 に答える
1

あなたが抱えている問題は、後置演算子がどのように機能するかではなく、問題を引き起こすコード行で何をしようとしているかに関係しています。

コメントで尋ねられたように、最初に書いた行の意味は何ですか?

longestStr[i++] = tmpStr[i++];

C 標準では指定されていないため、この行はいくつかの方法で解釈できます。

longestStr[i] = tmpStr[i+1];
i += 2;

また

longestStr[i+1] = tmpStr[i];
i += 2;

また

longestStr[i] = tmpStr[i];
i += 2;

いずれの場合も、最終的にカウンターが 2 回インクリメントされ、アルゴリズムが台無しになります。

正しい方法は、別の行でカウンターをインクリメントするか、適切なコンパイラーで同じコードにコンパイルする必要がある実用的なソリューション (提供している) を使用することです。

おそらく、カウンターが最大許容行サイズを超えていないことを確認する必要があることに注意してくださいMAXLINE(問題が入力でこれが発生しないと述べている場合を除きますが、その場合でも、コードが誤ってインクリメントするあなたのような状況に役立ちますカウンターを2回)。

于 2013-06-30T07:27:57.307 に答える