666HZ666 2024-04-14 20:52 采纳率: 100%
浏览 3
已结题

C语言字符串和字符串函数

img

img

img


最后那个函数不是查找换行符,并将换行符换成'\0',怎么输出还是Error?

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-14 20:52
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在学习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;
    }
    

    这里主要做了两个改动:

    1. s_gets() 函数中,我改变了移除换行符的部分。现在,如果字符串的最后一个字符是换行符,我们直接将其替换为空字符(\0)。这样可以避免不必要的 getchar() 循环。
    2. 我去掉了 ToUpper() 函数中的注释,并确保其格式正确。

    现在,当用户输入时,程序应该能正确地处理换行符,并在用户输入正确的答案之前显示 "Error"。注意,这里的 "Error" 是在每次循环迭代时显示的,而不是只在输入不匹配的情况下显示。如果你想在用户首次输入错误后才显示 "Error",你需要稍微调整一下主函数的逻辑。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月15日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 扫描枪扫条形码出现问题
  • ¥15 poi合并多个word成一个新word,原word中横版没了.
  • ¥15 【火车头采集器】搜狐娱乐这种列表页网址,怎么采集?
  • ¥15 求MCSCANX 帮助
  • ¥15 机器学习训练相关模型
  • ¥15 Todesk 远程写代码 anaconda jupyter python3
  • ¥15 我的R语言提示去除连锁不平衡时clump_data报错,图片以下所示,卡了好几天了,苦恼不知道如何解决,有人帮我看看怎么解决吗?
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?