Online Compiler C

#include <stdio.h> #include <string.h> int main() { int k; char str[1005]; if (scanf("%d", &k) != 1) return 0; getchar(); if (fgets(str, sizeof(str), stdin) == NULL) return 0; int len = strlen(str); if (len > 0 && str[len - 1] == '\n') { str[len - 1] = '\0'; len--; } if (len == 0) return 0; k = k % len; if (k == 0) { printf("%s\n", str); return 0; } printf("%s", &str[len - k]); for (int i = 0; i < len - k; i++) { putchar(str[i]); } printf("\n"); return 0; }
这段代码的功能是:读取一个整数 k 和一个字符串,然后将字符串循环右移 k 个字符后输出。它先读入 k,再读入一行字符串,去掉末尾换行符,然后计算有效右移位数(k 对字符串长度取模),最后分两段输出:先输出从倒数第 k 个字符开始的尾部,再输出从开头到倒数第 k 个字符之前的头部。

- 注意当 k 为 0 时,代码直接输出原字符串并返回,这个处理是正确的。但考虑一下:如果 k 不是 0,但 k 对 len 取模后为 0 的情况,实际上已经在 k = k % len 之后被处理了,所以后面的分支中 k 一定不为 0。

- 检查一下当 k 为负数时会发生什么?题目可能没有要求处理负数,但 C 语言中取模运算对于负数结果可能是负数,这会导致数组越界访问。思考一下是否需要增加对 k 为负数的处理。