尼莫点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,而将他们留在输入流中,那么为什么会出现竞争?

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

  • 写回答

2条回答 默认 最新

  • 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 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项