鱼C论坛

 找回密码
 立即注册
查看: 6136|回复: 17

一个特别简单的c语言程序,出现冲突,vs2015崩溃

[复制链接]
发表于 2016-7-30 09:18:33 | 显示全部楼层 |阅读模式
15鱼币
#include<stdio.h>

int main(){
        
        int a, b;
        char c1, c2;
        scanf_s("a=%d b=%d", &a, &b);
        scanf_s("%c%c", &c1, &c2);
        printf("a=%d,b=%d\n",a,b);
        printf("c1=%c\nc2=%c\n", c1, c2);
        return 0;
}
0x0F52D6AC (msvcr120d.dll) (ConsoleApplication4.exe 中)处有未经处理的异常:  0xC0000005:  写入位置 0x00000000 时发生访问冲突

我是新手,弄不明白,这个程序和教材上的一样,只要在对话框中输入a=200 b=32Aa  就会崩溃。另外,版本是vs2015.

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

使用道具 举报

发表于 2016-7-30 11:07:35 | 显示全部楼层
输入一个整数后要空格  输入第二个整数后要回车  输入第一个字符要空格 ,输入第二个字符要回车  这样就没问题了

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
mashucheng + 1 + 1 + 1 试过了,不行

查看全部评分

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

使用道具 举报

发表于 2016-7-30 16:49:42 | 显示全部楼层
本帖最后由 无符号整形 于 2016-7-30 21:21 编辑

因为你输入了字母,所以它不能把字母格式化成数字。
改成这样就不会崩溃,即使用户刻意那样做:
#include<stdio.h>
#include<windows.h>
 int main(){
         __try{
                  int a, b;
                  char c1, c2;
                  scanf_s("a=%d b=%d", &a, &b);
                  scanf_s("%c%c", &c1, &c2);
                  printf("a=%d,b=%d\n",a,b);
                  printf("c1=%c\nc2=%c\n", c1, c2);
                 }
         __except(EXCEPTION_EXECUTE_HANDLER){
      printf("程序出错了!");
      }

         return 0;
 } 

评分

参与人数 1荣誉 +2 鱼币 +3 贡献 +2 收起 理由
mashucheng + 2 + 3 + 2 谢谢你的回答哈

查看全部评分

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

使用道具 举报

发表于 2016-7-30 17:42:46 | 显示全部楼层
scanf_s("a=%d b=%d", &a, &b);      这一句错了  应该是 scanf_s("%d %d", &a, &b);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-30 18:51:38 | 显示全部楼层
无符号整形 发表于 2016-7-30 16:49
因为你输入了字母,所以它不能把字母格式化成数字。
改成这样就不会崩溃,即使用户刻意那样做:

这种法子,只是把问题规避了,还是没弄明白,为什么会出错误。是不是因为scanf_s() 的输入需要安全检查的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-30 21:20:10 | 显示全部楼层
mashucheng 发表于 2016-7-30 18:51
这种法子,只是把问题规避了,还是没弄明白,为什么会出错误。是不是因为scanf_s() 的输入需要安全检查的 ...

我说的很清楚:因为你输入了字母,所以它不能把字母格式化成数字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-30 22:47:11 | 显示全部楼层
1850946447 发表于 2016-7-30 17:42
scanf_s("a=%d b=%d", &a, &b);      这一句错了  应该是 scanf_s("%d %d", &a, &b);

难道2015版本的输出必须是scanf-s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-30 22:47:47 | 显示全部楼层
我的visualc++完美运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-1 09:16:42 | 显示全部楼层
scanf_s
换scanf
再试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-4 15:45:12 | 显示全部楼层
b=32Aa 中32和Aa之间输入的要有空格
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-4 19:55:46 | 显示全部楼层
连续输入应该就不行吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-4 20:02:02 | 显示全部楼层
#include <stdio.h>
#include <excpt.h>
#include <stdlib.h>
int main(){
        __try{
                int a, b;
                char c1, c2;
                scanf_s("a=%d b=%d", &a, &b);
                scanf_s("%c%c", &c1, &c2);
                printf("a=%d,b=%d\n", a, b);
                printf("c1=%c\nc2=%c\n", c1, c2);
        }
        __except (EXCEPTION_EXECUTE_HANDLER){
                printf("程序出错了!\n");
                system("pause");
        }

        return 0;
}


提问的人函数操作本身就存在错误

评分

参与人数 1荣誉 +4 鱼币 +4 贡献 +2 收起 理由
mashucheng + 4 + 4 + 2

查看全部评分

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

使用道具 举报

发表于 2016-8-15 12:07:53 | 显示全部楼层
scanf_s("%c%c", &c1, &c2);
这里的%c%c中间应该有空格把貌似,不然你也可以不用空格连着输入两个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-2 09:20:15 | 显示全部楼层
#include<stdio.h>
#include<windows.h>
int main(){
        __try{
                int a, b;
                char c1, c2;
                scanf_s("%d %d", &a, &b);
                while (char c = getchar() != '\n');

                scanf_s("%c %c", &c1, 1,&c2,1);
                printf("\n输入的值为:\n");
                printf("a=%d,b=%d\n", a, b);
                printf("c1=%c\nc2=%c\n", c1, c2);
        }
        __except (EXCEPTION_EXECUTE_HANDLER){
                printf("程序出错了!");
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-2 09:25:51 | 显示全部楼层
首先,你的代码是谁打的,这不就是误人子弟吗?

scanf_s()函数第一个形参列表里面只能是格式控制符,不能放别的a=之类的什么东西,而且你每输入一个地址,如果是字符类型,必须加它的长度。超过了就不会输入进去,但是代码还是会正常运行。还有就是注意缓冲区,你的第一次输入完成之后会加一个回车,那个回车也会跑到下一次的值中,如果下一次输入的是字符,那么恭喜你,中奖了。所以下次输入的时候,要清空缓冲区的内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-16 21:09:19 | 显示全部楼层
scanf() 和 scanf_s() 有区别 。有 _s 的会限制输入字符的个数。你取了几个地址,只能输入几个地址的数,超出的就会爆炸。(具体的题目中,a=  b= 他也是字符,而你只娶了2个地址,他就爆炸了)

没有_s的可以动态分配地址存(a= b=)所以不会爆炸。 我是这样理解的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-28 10:18:32 | 显示全部楼层
你的输入格式要跟你的scanf里面的格式相对应
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-21 11:24:35 | 显示全部楼层
scanf函数里不能有除了%d、\n以外的东西。。。
需要输出什么要靠printf,你当这是python啊?!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 06:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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