鱼C论坛

 找回密码
 立即注册
查看: 5813|回复: 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 编辑

因为你输入了字母,所以它不能把字母格式化成数字。
改成这样就不会崩溃,即使用户刻意那样做:


  1. #include<stdio.h>
  2. #include<windows.h>
  3. int main(){
  4.          __try{
  5.                   int a, b;
  6.                   char c1, c2;
  7.                   scanf_s("a=%d b=%d", &a, &b);
  8.                   scanf_s("%c%c", &c1, &c2);
  9.                   printf("a=%d,b=%d\n",a,b);
  10.                   printf("c1=%c\nc2=%c\n", c1, c2);
  11.                  }
  12.          __except(EXCEPTION_EXECUTE_HANDLER){
  13.       printf("程序出错了!");
  14.       }

  15.          return 0;
  16. }
复制代码

评分

参与人数 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 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <excpt.h>
  3. #include <stdlib.h>
  4. int main(){
  5.         __try{
  6.                 int a, b;
  7.                 char c1, c2;
  8.                 scanf_s("a=%d b=%d", &a, &b);
  9.                 scanf_s("%c%c", &c1, &c2);
  10.                 printf("a=%d,b=%d\n", a, b);
  11.                 printf("c1=%c\nc2=%c\n", c1, c2);
  12.         }
  13.         __except (EXCEPTION_EXECUTE_HANDLER){
  14.                 printf("程序出错了!\n");
  15.                 system("pause");
  16.         }

  17.         return 0;
  18. }
复制代码



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

评分

参与人数 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 | 显示全部楼层

  1. #include<stdio.h>
  2. #include<windows.h>
  3. int main(){
  4.         __try{
  5.                 int a, b;
  6.                 char c1, c2;
  7.                 scanf_s("%d %d", &a, &b);
  8.                 while (char c = getchar() != '\n');

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

  17.         return 0;
  18. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-4-18 12:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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