C言語で文字列を右に循環シフトさせる方法は?
C言語で文字列を右に循環シフトするには、以下の手順を実行します。
- char配列を定義して、元の文字列を保持します。
- シフトするビット数を表す変数nを定義する。
- 文字列の長さを取得するlen
- nがlenより大きい場合は、nをlenで割った余りを右シフトの有効ビット数として採用する。
- 一時的な長さlenの文字配列tempを作成する
- 元の文字列の後ろからn個の文字をtemp配列の最初のn個の文字にコピーする。
- もとの文字列の先頭からlen-n個を temp 配列の n 番目以降の len-1 番目までコピーする。
- 元の文字列配列にtemp配列をコピーする。
- 右にずれた文字列を出力する。
サンプルコードを以下に示します。
#include <stdio.h>
#include <string.h>
void rightRotateString(char str[], int n) {
int len = strlen(str);
n = n % len;
char temp[len];
// 复制后n位到临时数组的前n位
strncpy(temp, str + len - n, n);
// 复制前len-n位到临时数组的第n位到len-1位
strncpy(temp + n, str, len - n);
// 将临时数组复制到原始数组
strncpy(str, temp, len);
}
int main() {
char str[] = "abcde";
int n = 2;
printf("原始字符串:%s\n", str);
rightRotateString(str, n);
printf("右移后的字符串:%s\n", str);
return 0;
}
上記のコードを実行すると、次のような出力が表示されます。
原始字符串:abcde
右移后的字符串:deabc
ところで、上記のコードではstrncpy関数を使って文字列をコピーしています。strncpy関数は、コピー先の文字列の末尾に自動的に文字列の終わりを示す’\0’を追加します。