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

#include <stdio.h> int main() { int k, len = 0; char s[1001] = {0}, b[1001] = {0}; scanf("%d", &k); scanf("%s", s); while (s[len] != '\0') len++; k = k % len; for (int i = 0; i < len; i++) { b[i] = s[(len - k + i) % len]; } b[len] = '\0'; printf("%s\n", b); return 0; }
这段代码的目的是将输入的字符串向右循环移动 k 个位置,然后输出移动后的结果。它先读取一个整数 k 和一个字符串 s,计算字符串长度 len,然后通过取模运算处理 k 可能大于 len 的情况,最后用循环将字符重新排列到数组 b 中并输出。

- 检查循环赋值语句 `b[i] = s[(len - k + i) % len];` 中的索引计算。当 k 为 0 时,这个表达式会变成 `(len + i) % len`,结果正确;但当 k 为正数时,`len - k` 可能为负数,取模运算在 C 语言中可能产生负值,导致数组访问越界。考虑如何用加 len 的方式避免负数取模。

- 注意你只处理了 k 为正数的情况。如果输入 k 是负数,代码没有处理,但题目可能只要求正数。另外,当 k 等于 0 时,你的循环会正确复制原字符串,但可以思考是否有更简洁的方式处理边界情况。