「要求された回転」として定義される、点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);
}