在线编译器 C

#include <stdio.h> #include <string.h> int main() { int k; char str[1005]; // 读取整数 k if (scanf("%d", &k) != 1) return 0; // 读取换行符或空格,确保接下来的 fgets 能正确读入字符串 getchar(); // 读取整行字符串(因为字符串中可能包含空格) if (fgets(str, sizeof(str), stdin) == NULL) return 0; // 去掉 fgets 自动读入的末尾换行符 '\n' int len = strlen(str); if (len > 0 && str[len - 1] == '\n') { str[len - 1] = '\0'; len--; } // 如果字符串为空(处理边界情况),直接结束 if (len == 0) return 0; // 核心步骤:对 k 取模,防止 k 大于字符串长度 k = k % len; // 如果 k 为 0,说明不需要移动,直接输出原字符串 if (k == 0) { printf("%s\n", str); return 0; } // 1. 先打印后半部分(将被移到最前面的 k 个字符) // 起始位置是 len - k printf("%s", &str[len - k]); // 2. 再打印前半部分(被挤到后面的部分) // 只需要打印前 len - k 个字符 for (int i = 0; i < len - k; i++) { putchar(str[i]); } printf("\n"); return 0; }
这段代码实现了一个字符串循环右移的功能。它读取一个整数k和一个字符串,然后将字符串向右循环移动k个位置。

代码的思路是:先打印字符串的后k个字符,再打印前面的部分。例如,字符串"abcdef"右移2位,会先打印"ef",再打印"abcd",得到"efabcd"。

代码中有一个逻辑错误。循环右移的含义是每个字符向右移动k个位置,末尾的字符会绕到开头。但当前代码实际上做的是将后k个字符整体移到前面,这相当于循环左移,而不是右移。

- 检查一下循环右移和循环左移的区别。当前代码将后k个字符放到前面,这是左移还是右移?可以拿一个短字符串手动模拟一下。
- 考虑一下,如果要把字符串循环右移k位,应该先打印哪一部分?是后k个字符先打印,还是前len-k个字符先打印?