Online Compiler C

#include <stdio.h> enum {size = 1001}; void hhh(char a[size]) { char first = a[0]; int len = 0; while(a[len] != '\0') { a[len] = a[len+1]; len++; } a[len -1] = first; } int main() { long long int k, lon = 0; char a[1001]; scanf("%lld", &k); scanf("%[^\n]", a); int p = 0; while(a[p] != '\0' ) { lon++; p++; } if(k > lon) { k = k % lon; } for(int i = 0; i< k; i++) { hhh(char a[size]); } for(int i = 0; i< lon; i++) { printf("%c", a[i]); } return 0; }
这段代码试图实现一个字符串循环左移的功能,但存在多个问题。代码中定义了一个函数 `hhh`,它把字符串的第一个字符移到末尾,实现一次左移。主函数中读取一个整数 `k` 和一个字符串,然后对字符串执行 `k` 次左移。

代码的主要问题在于函数调用和字符串读取。

- 在 `main` 函数中调用 `hhh` 时,写法 `hhh(char a[size]);` 是错误的。函数调用时不需要写出类型和数组大小,只需要传入数组名(即指针)即可。正确的写法应该是 `hhh(a);`。

- 另外,`scanf("%[^\n]", a);` 这一行读取字符串时,由于前面 `scanf("%lld", &k);` 读取整数后会在输入缓冲区留下一个换行符,这个换行符会被 `%[^\n]` 直接匹配到,导致字符串读取为空。需要处理这个换行符。

- 函数 `hhh` 内部的循环逻辑也有问题:当 `len` 递增到字符串末尾时,`a[len+1]` 会访问到 `\0` 之后的位置,可能越界。而且最后 `a[len-1] = first;` 在字符串长度为0时也会出错。

- 变量 `lon` 计算字符串长度,但代码中已经用 `p` 计算了长度,可以直接用 `p` 作为长度,不需要 `lon`。