C言語で文字列を右に循環シフトさせる方法は?

C言語で文字列を右に循環シフトするには、以下の手順を実行します。

  1. char配列を定義して、元の文字列を保持します。
  2. シフトするビット数を表す変数nを定義する。
  3. 文字列の長さを取得するlen
  4. nがlenより大きい場合は、nをlenで割った余りを右シフトの有効ビット数として採用する。
  5. 一時的な長さlenの文字配列tempを作成する
  6. 元の文字列の後ろからn個の文字をtemp配列の最初のn個の文字にコピーする。
  7. もとの文字列の先頭からlen-n個を temp 配列の n 番目以降の len-1 番目までコピーする。
  8. 元の文字列配列にtemp配列をコピーする。
  9. 右にずれた文字列を出力する。

サンプルコードを以下に示します。

#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’を追加します。

bannerAds