You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C语言中如何实现字符串的循环右移?

字符串循环右移问题修正

你的需求是实现字符串循环右移(比如"Hello"右移3位得到"lloHe"),但当前代码只输出了'k',完全没达到预期,问题出在这几个地方:

  • 数组类型与定义错误:你用int a[5]存储字符,但初始化了6个元素(包括'\0'),直接越界;而且字符串应该用char类型数组,不是int。
  • 指针类型错误:ptr被定义成了char,这只能存单个字符,不能用来指向数组地址,应该用char*类型。
  • 逻辑完全偏离:把数组地址赋值给char类型的ptr会被截断成字符的ASCII值,ptr+3就变成了'h'的ASCII码加3,自然输出'k',和循环右移完全不沾边。

正确实现方式(两种)

方式一:用临时数组拼接

这种方法直观,适合新手理解:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello";
    int shift = 3;
    int len = strlen(str);
    
    // 处理右移位数超过字符串长度的情况,比如右移6位等于右移1位
    shift %= len;
    if (shift < 0) shift += len; // 可选:处理左移的情况
    
    char result[100]; // 定义足够大的临时数组存结果
    // 先复制后shift个字符到结果开头
    strncpy(result, str + len - shift, shift);
    // 再复制前面的字符接在后面
    strncpy(result + shift, str, len - shift);
    result[len] = '\0'; // 必须加字符串结束符,否则会输出乱码
    
    printf("原字符串:%s\n", str);
    printf("右移%d位后:%s\n", shift, result);
    
    return 0;
}

方式二:原地反转(不使用临时数组)

这种方法更节省内存,思路是通过三次反转实现循环右移:

  1. 反转整个字符串
  2. 反转前shift个字符
  3. 反转剩下的字符

代码实现:

#include <stdio.h>
#include <string.h>

// 辅助函数:反转字符串的某一段
void reverse(char *start, char *end) {
    while (start < end) {
        char temp = *start;
        *start = *end;
        *end = temp;
        start++;
        end--;
    }
}

int main() {
    char str[] = "Hello";
    int shift = 3;
    int len = strlen(str);
    
    shift %= len;
    if (shift == 0) { // 右移0位直接输出原字符串
        printf("%s\n", str);
        return 0;
    }
    
    // 三次反转实现循环右移
    reverse(str, str + len - 1); // 反转整个字符串
    reverse(str, str + shift - 1); // 反转前shift个字符
    reverse(str + shift, str + len - 1); // 反转剩余部分
    
    printf("右移%d位后:%s\n", shift, str);
    
    return 0;
}

内容的提问来源于stack exchange,提问作者star

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:30:54