Онлайн компилятор C

#include <stdio.h> int main() { int k, len = 0; char s[1001] = {0}, b[1001] = {0}; scanf("%d", &k); fgets(s, sizeof(s), stdin); for (int i = 0; s[i] != '\0'; i++) { s[i] = s[i + 1]; } for (int i = 0; s[i] != '\0'; i++) { len++; } if (k > len) { k = k % len; } int size = k; for (int i = 0; s[i] != '\0'; i++) { if (k != 0) { b[i] = s[len - k]; k--; } else { b[i] = s[i - size]; } } for (int i = 0; b[i] != '\0'; i++) { printf("%c", b[i]); } return 0; }
这段代码试图实现字符串的循环右移功能:输入一个整数k和一个字符串,然后将字符串循环右移k位并输出。

代码的主要问题是逻辑混乱,没有正确实现循环右移。具体来说:

- 第一个循环试图移除fgets读取时可能残留的换行符,但方法不正确,它把整个字符串都左移了一位,导致第一个字符丢失。
- 计算字符串长度len的方式效率低,可以直接用strlen。
- 循环右移的核心算法有错误:当k不为0时,它从字符串末尾取字符放到b的开头,但k递减后索引会错乱;当k为0时,它用i - size作为索引,但size等于原始k,这会导致负索引或错误位置。

- 提示1:循环右移的本质是将字符串分成两部分:后k个字符和前len-k个字符,然后交换顺序。思考如何用两个循环分别复制这两部分到新数组。
- 提示2:注意处理k大于字符串长度的情况,你已经用取模处理了,但取模后k可能为0,此时字符串不变,你的代码需要正确处理这种情况。另外,fgets会读取换行符,建议用scanf("%s")读取字符串,或者正确处理换行符。