在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; }
方式二:原地反转(不使用临时数组)
这种方法更节省内存,思路是通过三次反转实现循环右移:
- 反转整个字符串
- 反转前shift个字符
- 反转剩下的字符
代码实现:
#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
相关产品推荐
相关产品推荐

