尼莫点Nemo 2023-12-04 19:30 采纳率: 50%
浏览 7

关于putchar与scanf是否读入回车符的问题(\r\n)

问题原型

img

代码如下:


#include<cstdio>

int main()
{
    int a, b, choice;
    char ch, op, get;

    scanf("%dx%c%d=0", &a, &ch, &b);
    getchar();
    while (choice != (ch == '+' ? (-1) * b / a : b / a))
    {
        scanf("%c.%d", &op, &choice);//scanf会把输入区的回车(\r\n)吃掉?
        getchar();
    }
    printf("%c", op);

    return 0;
}

问题描述:
特定情况无法输出特定范围内结果(猜测是结果随机输出了,但并非运行错误之类)
代码测试示例有:

11x+1=0(\r\n)
A.-1(\r\n)
B.0(\r\n)
C.1(\r\n)
D.2(\r\n)
(2) 9x-18=0(\r\n)
A.-1(\r\n)
B.0(\r\n)
C.1(\r\n)
D.2(\r\n)
(3) 2x-1=0(\r\n)
A.-1(r\\n)
B.0(\r\n)
C.1(\r\n)
D.2(\r\n)

目前无论是我的校赛网站还是codeblock或者vscode都无法成功运行,只有Clion可以(不得不说Clion真的强大)

之前也问过其他学长,他们认为是scanf会自动把输入一行的末尾的回车符取走,然而我按照他们的说法将getchar()注释掉vscode仍然无法运行成功,上网查也是说scanf在%c格式符下不会自动忽略\r\n。
也有学长说getchar与scanf竞争ABCD四个选项字母,然而此处我想不懂,scanf不会取走\r\n,而将他们留在输入流中,那么为什么会出现竞争?

(鞠躬)请教大家,希望不吝赐教。

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-04 22:41
    关注

    【以下回答由 GPT 生成】

    问题的关键在于scanf函数和getchar函数对回车符(\r\n)的处理方式。具体来说,问题是在第二个scanf函数中,当输入字母选项之后按下回车键,程序无法正常输出结果。这是由于scanf函数在%c格式符下不会自动忽略回车符,而将其留在输入流中。

    为了解决这个问题,可以采取以下两种方式之一:

    解决方案一:使用一个额外的getchar函数 在第二个scanf函数之后添加一个getchar函数,用于读取并丢弃换行符。代码如下:

    scanf("%c.%d", &op, &choice);
    getchar(); // 读取并丢弃换行符
    

    这样,程序就能正常输出结果了。

    解决方案二:修改scanf函数的格式 如果你希望在不使用额外的getchar函数的情况下解决问题,可以修改第二个scanf函数的格式,让其读取并忽略回车符。具体来说,可以在%c前面加上一个空格,同时将格式中的点号(.)替换为空格。代码如下:

    scanf(" %c %d", &op, &choice);
    

    这样,scanf函数会自动忽略回车符,并正确读取选项字母和数字。

    以上两种解决方案中,你可以选择其中一种来解决问题。根据你的实际需求和偏好,选择适合的方法即可。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月4日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址