鱼C论坛

 找回密码
 立即注册
查看: 2216|回复: 9

[已解决]scanf 返回值被忽略

[复制链接]
发表于 2020-11-17 23:22:14 | 显示全部楼层 |阅读模式
5鱼币
在微软的编辑器里 老是报错
#include <stdio.h>
#include <math.h>
int main( )
{
    int a, b, c, q, x1, x2;
    printf("请输入三位数:");
    scanf("%d\n%d\n%d\n", &a, &b, &c);
    if (a >= 0)
    {
        q = b * b - 4 * a * c;
        if (q >= 0)
        {
            x1 = (-b + sqrt(q) / 2 * a);
            x2 = (-b - sqrt(q) / 2 * a);
            printf("该方程的解为:x1=%d,x2=%d", x1, x2);
        }
        else
        {
            printf("该方程无解!");
        }
    }
    else {
        printf("该方程不是一元二次方程");
    }
    return 0;
}
最佳答案
2020-11-17 23:22:15
紫癜聪 发表于 2020-11-19 14:29
我自己找到原因了

就是微软的编译器认为

你的前两种方法没有问题,第三种方法是自欺欺人的做法,真正的第三种方法应该是 。。。。。。看出来了,你是不想选最佳答案了,那么,我也就没什么好说的了

最佳答案

查看完整内容

你的前两种方法没有问题,第三种方法是自欺欺人的做法,真正的第三种方法应该是 。。。。。。看出来了,你是不想选最佳答案了,那么,我也就没什么好说的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-17 23:22:15 | 显示全部楼层    本楼为最佳答案   
紫癜聪 发表于 2020-11-19 14:29
我自己找到原因了

就是微软的编译器认为

你的前两种方法没有问题,第三种方法是自欺欺人的做法,真正的第三种方法应该是 。。。。。。看出来了,你是不想选最佳答案了,那么,我也就没什么好说的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-18 09:56:23 | 显示全部楼层
不要用
scanf("%d\n%d\n%d\n", &a, &b, &c);

scanf只能读取一行
scanf("%d %d %d", &a, &b, &c);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-18 10:00:28 | 显示全部楼层

                               
登录/注册后可看大图
不对 应该是最后一个\n的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-18 14:18:45 | 显示全部楼层
#include <stdio.h>
#include <math.h>
int main()
{
        int a, b, c, delta;
        double p, q, x1, x2;
        printf("请输入三位数:");
        scanf("%d%d%d", &a, &b, &c);

        if (a < 0)
        {
                a = -a;
                b = -b;
                c = -c;
        }
        else if(a > 0)
        {
                delta = b * b - 4 * a * c;
                if (delta > 0)
                {
                        p = -b / (2.0 * a);
                        q = sqrt(delta) / (2.0 * a);
                        x1 = p + q;
                        x2 = p - q;
                        printf("该方程有两个不同的解为:\nx1 = %.2f\nx2 = %.2f\n", x1, x2);
                }
                else if (delta == 0)
                {
                        p = -b / (2.0 * a);
                        x1 = p;
                        printf("该方程有两个相同的解为:\nx1 = x2 = %.2\n", p);
                }
                else
                {
                        p = -b / (2.0 * a);
                        delta = -delta;
                        q = sqrt(delta) / (2.0 * a);
                        printf("该方程有两个共轭复根为:\nx1 = %.2f + %.2fi\nx2 = %.2f - %.2fi\n", p, q, p, q);
                }
        }
        else
        {
                printf("该方程不是一元二次方程\n");
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-19 14:29:00 | 显示全部楼层

我自己找到原因了

就是微软的编译器认为
'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

VS认为 scanf(); 不安全。

解决方法1:

scanf_s();        //用scanf_s();替换

解决方法2:添加预编译

#define _CRT_SECURE_NO_WARNINGS

解决方法3:

#param warning(disable:4996)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-19 14:29:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-19 14:30:15 | 显示全部楼层
mrcrisis 发表于 2020-11-18 10:00
不对 应该是最后一个\n的问题

你用VC试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-19 14:31:55 | 显示全部楼层
mrcrisis 发表于 2020-11-18 09:56
不要用  
scanf只能读取一行

这个问题不大
我用的是VC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-21 09:44:31 | 显示全部楼层
紫癜聪 发表于 2020-11-19 14:29
我自己找到原因了

就是微软的编译器认为

第三种方法:点开“项目” --> 项目属性 --> C / C++ --> 所有选项 --> 安全性检查 --> 禁用安全检查(/GS)

当然,这种设置,你必须清楚明白,这个安全报警,仅仅是 scanf() 引起的,而不是其他的安全问题引起的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 13:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表