1

「要求された回転」として定義される、点kで回転できるプログラムを作成しようとしています。

例:rotate( "derp"、3)=> pder

この関数の私のコードは、以下に示すように、rotateと呼ばれます。これは、メインで定義されているcharポインター配列startStringと、回転数の両方を取り込んでいます(コマンドラインから整数を取得するためにatolを使用しているため、長いintです)。

int rotate(char *startString, long int rotations) {
    char *doubleString = malloc((sizeof startString * 2) + sizeof(char));
    strcat(doubleString, startString);
    strcat(doubleString, startString);
    long int stringSize = (sizeof startString - 1);
    long int breakIndex = (rotations % stringSize);
    char* rotatedString = malloc((sizeof startString + sizeof(char)));

    int i;

    for (i = 0; i < stringSize + 1; i++) {
        char pushedCharacter = doubleString[(int)breakIndex + i];
        strcat(rotatedString, &pushedCharacter);
    }

    printf("%s\n", rotatedString);
    printf("%s\n", doubleString);
    return 0;

}

しかし、出力するときに、ドッグハウスのようなものを使用すると、奇妙な?4???が表示されます。rotateStringの出力の前。また、derpでは完全に機能せず、代わりに同じ?4???でpderpを出力します。前に。このランタイムエラーはどこで発生していますか?

編集

与えられた答えは正しかったが、目標は与えられた文字列の長さよりも長い回転を受け入れることができるようにすることでした。そのコードは以下のとおりです。

void rotate(char * startString, long int rotations) {
    long int stringSize = strlen(startString);

    long int breakIndex = (rotations % stringSize);
    char *rotatedString = malloc(stringSize + 1); //counting extra char for null terminator
    strncpy(rotatedString, startString + breakIndex, stringSize - breakIndex);
    strncpy(rotatedString + stringSize - breakIndex, startString, breakIndex);
    rotatedString[stringSize] = '\0'; // for the ending null character of the char array

    printf("Result: %s\n", rotatedString);
    free(rotatedString);

}

4

1 に答える 1

2

終了NUL文字を含む文字列の長さであるstrlen(startstring)+ 1ではなく、ポインタのサイズであるsizeof(startstring)を使用しているため、ダブルストリングの初期化で割り当てられるメモリが少なすぎます。これは、コードがバッファの終わりを上書きして、陽気な結果をもたらすことを意味します。次のことを試してください。

void rotate(char * startString, int rotation) {
    int len = strlen(startString);
    if (len == 0 || len <= rotation)
        return;

    char *rotatedString = malloc(len + 1); /* One extra char for the terminating NUL */
    strncpy(rotatedString, startString + rotation, len - rotation);
    strncpy(rotatedString + len - rotation, startString, rotation);
    rotatedString[len] = '\0';

    printf("%s\n", rotatedString);
    free(rotatedString);       /* don't leak memory! */
}
于 2013-02-25T23:46:11.740 に答える