#include <stdio.h>
#include <string.h>
int main()
{
int n;
char a[1000];
int k = 1;
while(scanf("%d",&n) != EOF && n != 0)
{
if (k ==1)
{
getchar();
k++;
}
gets(a);
int x = 0;
int h = strlen(a);
for (int i = 0; i < h;i++)
{
if(a[i] == ' '){
for(int j = i-1;j >= x;j--){
printf("%c",a[j]);
}
printf(" ");
x = i + 1;
}
}
for(int m = h - 1; m >= x; m--){
printf("%c",a[m]);
}
printf("\n");
n--;
}
return 0;
}
Presentation Error(PE)指的是程序输出结果和标准答案除了输出格式不同以外,其它地方完全相同。例如,程序需要输出一列数字,但程序输出的每个数字之间多出了一个空格或缺少了一个换行符等。
这段代码的主要功能是将输入的每行字符串反转输出,直至输入的是数字0停止。但在代码中存在以下问题:
第5行代码中,当前循环次数为1时才调用了getchar函数,这会导致输入的第一行字符串中被丢弃第一个字符。建议将k的初始值设为0,不需要特殊处理第一行字符串。
第11行代码中,使用了gets函数,这个函数存在安全隐患,容易被恶意利用。建议使用比较安全的fgets函数。由于fgets函数会读入输入流中的换行符,需要做特殊的处理。
第17行代码中,循环处理字符串中的每一个字符时,当字符串中没有空格时,循环处理会失败。建议将这段代码放在if判断之外,作为一个else分支。
第18行代码中,应该使用for循环从i到x+1,将单词中的每个字符输出。
第23行代码中,应该使用for循环从h-2到x,将单词中的每个字符输出。循环初始值应该为h-2而不是h-1,因为fgets函数会将输入行的换行符'\n'存入字符串中,需要将其排除。
#include <stdio.h>
#include <string.h>
int main()
{
int n;
char a[1000];
int k = 0;
while (scanf("%d", &n) != EOF && n != 0) {
getchar();
fgets(a, sizeof(a), stdin);
int x = 0;
int h = strlen(a);
if (a[h - 1] == '\n') { // 处理fgets读入的换行符
a[h - 1] = '\0';
h--;
}
for (int i = 0; i < h; i++) {
if (a[i] == ' ') {
for (int j = i - 1; j >= x; j--) {
printf("%c", a[j]);
}
printf(" ");
x = i + 1;
}
else if (i == h - 1) { // 处理最后一个单词
for (int j = i; j >= x; j--) { // 修改循环初始值
printf("%c", a[j]);
}
}
}
printf("\n");
n--;
}
return 0;
}
此答案分析部分参考chatGPT