VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1309|回复: 6

[已解决]代码在devc++运行良好,在vs2013不能执行

[复制链接]
00_avatar_middle
最佳答案
0 
在线会员 发表于 2020-5-26 21:04:22 | 显示全部楼层 |阅读模式
本帖最后由 看什么看 于 2020-5-26 21:05 编辑

新手小白请教个问题
C学习中,想转用vs

有一串代码在dev c++运行良好,在vs2013不行,不知道是什么问题,

#include "stdafx.h"
#include <string.h>

int _tmain()
{
    char first_name[40];
    char last_name[40];
    int first_name_length = 0;
    int last_name_lenght = 0;

    printf("What's your first name:");
    scanf_s("%s", first_name);

    printf("What's your last name:");
    scanf_s("%s", last_name);

    first_name_length = strlen(first_name);     
    last_name_lenght = strlen(last_name);

    printf("a.\"%s,%s\"\n", first_name, last_name);
    printf("b.\"%20s,%20s\"\n", first_name, last_name);
    printf("c.\"%-20s,%-20s\"\n", first_name, last_name);
    printf("d.%*s,%*s\n", first_name_length + 3, first_name, last_name_lenght + 3, last_name);

    return 0;
}

输入wang回车,结果如下图,哪位方便帮忙指点一下问题在哪
图片


最佳答案
70_avatar_small
2020-5-27 10:18:50
scanf_s 缺参数
scanf_s("%s", first_name,sizeof(first_name));
QQ图片20200526210115.png




上一篇:请问怎么打开谷歌的搜索
下一篇:new与delete的一点疑问
70_avatar_middle
最佳答案
49 
在线会员 发表于 2020-5-27 10:18:50 | 显示全部楼层    本楼为最佳答案   
bestAnswer
scanf_s 缺参数
scanf_s("%s", first_name,sizeof(first_name));
00_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-5-27 10:44:32 | 显示全部楼层
本帖最后由 看什么看 于 2020-5-27 10:52 编辑

QQ群的一位老兄(vs程序员)帮忙解决了问题,
通过远程桌面方式。

在此 谢谢vs程序员
00_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-5-27 10:53:16 | 显示全部楼层
tony666 发表于 2020-5-27 10:18
scanf_s 缺参数
scanf_s("%s", first_name,sizeof(first_name));

刚试了一下您的方式,确实解决问题了,感谢。
00_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-5-27 10:57:35 | 显示全部楼层
scanf()函数是标准C中提供的标准输入函数,用以用户输入数据

scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。

原因和区别:

scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:

    //例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节
     
    char buf[5]={'\0'};
     
    scanf("%s", buf);
     
    //如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。

以上代码如果用scanf_s()则可避免此问题:

    char buf[5]={'\0'};
     
    scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放'\0'
     
    //如果输入1234567890,则buf只会接受前4个字符

注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符.

PS: 很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。

35_avatar_middle
最佳答案
0 
在线会员 发表于 2020-5-28 23:54:32 | 显示全部楼层
看什么看 发表于 2020-5-27 10:57
scanf()函数是标准C中提供的标准输入函数,用以用户输入数据

scanf_s()函数是Microsoft公司VS开发工具提 ...

您的讲解非常清楚,多谢多谢。
00_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-5-29 00:19:22 | 显示全部楼层
人走茶不凉 发表于 2020-5-28 23:54
您的讲解非常清楚,多谢多谢。

也是给自己遇到的问题做一个笔记吧。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-12-10 08:17

Powered by CcTry.CoM

© 2009-2021 cctry.com

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