在线编译器 C

#include <stdio.h> #include <string.h> int main() { long long int k; char a[1001],b[1001]; scanf("%lld", &k); scanf("%[^\n]", a); int lon = strlen(a); if(k > lon) { k = k % lon; } for(int i = 0; i< lon -k; i++) { b[i+k] = a[i]; } int j = 0; for(int i = lon - k; i< lon; i++) { b[j] = a[i]; j++; } for(int i = 0; i < lon; i++) { printf("%c", b[i]); } return 0; }
这段代码试图实现一个字符串的循环右移功能,将输入的字符串 `a` 向右移动 `k` 个位置后存入 `b` 并输出。但代码存在几个问题。

- 第一个 `scanf` 读取整数后,输入缓冲区会留下一个换行符,导致第二个 `scanf` 读取 `a` 时可能直接读到空字符串或换行符,而不是你想要的字符串。
- 当 `k` 等于 0 或 `lon` 的倍数时,`k % lon` 的结果为 0,此时第一个循环 `i < lon - k` 会遍历整个字符串,但 `b[i+k]` 即 `b[i]` 被赋值,而第二个循环 `i < lon` 不会执行,这样 `b` 数组的某些位置可能未被初始化,输出结果可能不正确。

- 检查第二个 `scanf` 的格式,确保它能正确读取包含空格的字符串。
- 考虑 `k` 为 0 或 `lon` 的倍数时,你的循环逻辑是否覆盖了所有情况,特别是 `b` 数组的每个元素是否都被正确赋值。