


最后那个函数不是查找换行符,并将换行符换成'\0',怎么输出还是Error?
关注引自免费微信小程序:皆我百晓生
看起来你在学习C语言中的字符串处理。首先,让我们分析一下代码的问题。
在图2中,s_gets() 函数是用来从标准输入读取一行文本并存储到指定的字符数组中的。它通过调用 fgets() 来实现这一功能,并且处理了可能存在的换行符。
然而,在图3中,你尝试简化这个过程,但存在一些错误。下面是针对图3中的代码进行修改后的版本:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define ANSWER "GRANT"
#define SIZE 40
char *s_gets(char *st, int n);
void ToUpper(char *st);
int main(int argc, char *argv[]) {
char t[SIZE];
s_gets(t, SIZE);
ToUpper(t);
while (strcmp(t, ANSWER) != 0) {
puts("Error");
s_gets(t, SIZE);
ToUpper(t);
}
return 0;
}
void ToUpper(char *st) {
while (*st != '\0') {
*st = toupper(*st);
st++;
}
}
char *s_gets(char *st, int n) {
char *retval = fgets(st, n, stdin);
if (retval) {
size_t len = strlen(st);
if (len > 0 && st[len - 1] == '\n') {
st[len - 1] = '\0'; // 直接在这里去掉换行符
} else {
while (getchar() != '\n');
}
}
return retval;
}
这里主要做了两个改动:
s_gets() 函数中,我改变了移除换行符的部分。现在,如果字符串的最后一个字符是换行符,我们直接将其替换为空字符(\0)。这样可以避免不必要的 getchar() 循环。ToUpper() 函数中的注释,并确保其格式正确。现在,当用户输入时,程序应该能正确地处理换行符,并在用户输入正确的答案之前显示 "Error"。注意,这里的 "Error" 是在每次循环迭代时显示的,而不是只在输入不匹配的情况下显示。如果你想在用户首次输入错误后才显示 "Error",你需要稍微调整一下主函数的逻辑。