1

我正在尝试创建一个能够在 k 点旋转的程序,定义为“请求的旋转”。

示例:rotate("derp", 3) => pder

我的这个函数的代码叫做旋转,如下所示。它接受我的 main 中定义的 char 指针数组 startString 和旋转次数(一个 long int,因为我使用 atol 从命令行获取整数)。

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;

}

但是,当我输出时,如果我使用类似 doghouse 的东西,我会得到一个奇怪的 ?4??? 在旋转字符串的输出前面。它也完全不适用于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

您的双字符串初始化分配的内存太少,因为您使用的是 sizeof(startstring),它是指针的大小,而不是 strlen(startstring) + 1,它是包含终止 NUL 字符的字符串的长度。这意味着您的代码正在用有趣的结果覆盖缓冲区的末尾。尝试以下操作:

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 回答