mashucheng 发表于 2016-7-30 09:18:33

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

#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.

陌雨 发表于 2016-7-30 11:07:35

输入一个整数后要空格输入第二个整数后要回车输入第一个字符要空格 ,输入第二个字符要回车这样就没问题了

无符号整形 发表于 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;
}

1850946447 发表于 2016-7-30 17:42:46

scanf_s("a=%d b=%d", &a, &b);      这一句错了应该是 scanf_s("%d %d", &a, &b);

mashucheng 发表于 2016-7-30 18:51:38

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

这种法子,只是把问题规避了,还是没弄明白,为什么会出错误。是不是因为scanf_s() 的输入需要安全检查的问题

无符号整形 发表于 2016-7-30 21:20:10

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

我说的很清楚:因为你输入了字母,所以它不能把字母格式化成数字。

大奔G 发表于 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

大奔G 发表于 2016-7-30 22:47:47

我的visualc++完美运行。

ryxcaixia 发表于 2016-8-1 09:16:42

scanf_s
换scanf
再试

littlestar 发表于 2016-8-4 15:45:12

b=32Aa 中32和Aa之间输入的要有空格{:10_256:}

dwk.cn 发表于 2016-8-4 19:55:46

连续输入应该就不行吧

miss陈 发表于 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;
}



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

千亩计者 发表于 2016-8-15 12:07:53

scanf_s("%c%c", &c1, &c2);
这里的%c%c中间应该有空格把貌似,不然你也可以不用空格连着输入两个数

1366627538 发表于 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;
}

1366627538 发表于 2016-9-2 09:25:51

首先,你的代码是谁打的,这不就是误人子弟吗?

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

怎么还是菜鸟 发表于 2016-9-16 21:09:19

scanf() 和 scanf_s() 有区别 。有 _s 的会限制输入字符的个数。你取了几个地址,只能输入几个地址的数,超出的就会爆炸。(具体的题目中,a=b= 他也是字符,而你只娶了2个地址,他就爆炸了)

没有_s的可以动态分配地址存(a= b=)所以不会爆炸。 我是这样理解的

小猫拉屎 发表于 2016-9-28 10:18:32

你的输入格式要跟你的scanf里面的格式相对应

1314xxxxxx 发表于 2017-5-21 11:24:35

scanf函数里不能有除了%d、\n以外的东西。。。
需要输出什么要靠printf,你当这是python啊?!
页: [1]
查看完整版本: 一个特别简单的c语言程序,出现冲突,vs2015崩溃