我正在尝试创建一个能够在 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);
}