4

目的:ポインタ表記のみを使用して、文字のリスト内のすべての値を1つの要素だけ左(先頭に向かって)に回転させる関数を記述します。

#include <stdio.h>

void rotateLeft( char word[] );

int main (void)
{
//  Local Definitions
    char word[20] = "applications";
//  Statements
    printf( "Before rotation: %s\n", word );
    rotateLeft( word );
    printf( " After rotation: %s\n", word );
    return 0;
}

/*  =================================================================== */
/*  Rotate left
    PRE: word[]
    POST: word rotated left
*/
void rotateLeft( char word[] )
{
    char hold;
    char *pW;
    pW = word;
    hold = *pW;

    while (*pW != '\0')
    {
        printf("%c ", *pW);
        *pW = *(pW + 1);
        *pW++;
    }

    *(pW - 1) = hold;
    *pW = '\0';

    return;
}

私のインストラクターは、*(pW + 1)を使用するのは非常に醜いスタイルだと教えてくれました。現在使用しているスタイルを使用せずに、このソリューションを解決する別の方法があるかどうか疑問に思いました。

4

1 に答える 1

4

*(pW + 1)と同じpW[1]です。ただし、「非常に醜い」についてはわかりません。実際、場合によっては、おそらく優先されます。実際、質問の冒頭で、とにかくポインター表記のみを使用することになっていると言っていました。たぶんあなたのインストラクターは名前が気に入らなかったのpWですか?word必要ありません。他に何も必要ないのでpW、プログラム内のすべての参照を に置き換えるだけで済みますword

*pW++ただし、プログラムでは、は と何も変わらないことに注意してくださいpW++。プログラムを clang でコンパイルすると、次の便利な警告が表示されます。

example.c:35:13: warning: expression result unused [-Wunused-value]
            *pW++;
            ^~~~~
1 warning generated.

*pW = '\0'ラインも必要ありません。既存の null ターミネータを変更しなかったため、そのステートメントは a\0を a で上書きするだけ\0です。

于 2013-01-30T23:33:54.183 に答える