Online Compiler C

#include <stdio.h> int main() { int k,n=0,p; char s[1001] , t[1001]; scanf("%d", &k); while ((s[n]=getchar())!= EOF) { n++; } s[n] = '\0'; printf("k = %d s = %s\n", k,s); p=0; for (int i = n-k; i<n; i++) { t[p++]=s[i]; } printf(" t = %s\n", t); for (int i=0;i<n-k;i++){ t[p++]=s[i]; } t[p]=0; printf("%s", t); return 0; }
这段代码试图实现一个字符串循环右移k位的功能。它从输入读取一个整数k,然后读取一个字符串s,最后尝试将s循环右移k位后输出到t。

代码的主要问题在于读取字符串的方式。使用getchar()读取时,第一个字符会读取到换行符(来自输入k之后的回车),导致字符串开头多了一个换行符。同时,循环条件`(s[n]=getchar())!= EOF`在输入结束时不会正确终止,因为从终端输入时通常需要Ctrl+D或Ctrl+Z才能产生EOF。

- 检查字符串读取部分:输入k后按回车,这个换行符会被getchar()读取并存入s[0],导致字符串开头多了一个换行符。考虑如何跳过这个换行符。
- 思考循环终止条件:从终端输入时,getchar()在遇到文件结束符前不会返回EOF。如果希望读取一行字符串,可以考虑使用其他输入函数,或者明确终止输入的方式。