鱼C论坛

 找回密码
 立即注册
查看: 4794|回复: 18

strcpy的问题。

[复制链接]
发表于 2015-12-27 02:51:51 | 显示全部楼层 |阅读模式
30鱼币
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation,
在用strcpy的时候提示这个。strcpy_s()又不在std里。该怎么解决??

最佳答案

查看完整内容

有几个语法错误而已 改好了 直接编译就行 我用的是vs2010 如果你那边不支持 直接用这个.h 和.cpp编译即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-27 02:51:52 | 显示全部楼层
string.zip (4.67 KB, 下载次数: 7)

有几个语法错误而已
改好了 直接编译就行

我用的是vs2010

如果你那边不支持 直接用这个.h 和.cpp编译即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-27 08:29:18 | 显示全部楼层
你的编译器是vc吧,vs就应该是支持strcpy_s的,他们出现主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。库函数改写例子:
mkdir改写为 _mkdir
fopen”改写为 fopen_s
stricmp改写为 stricmp_s
strcpy改写为strcpy_s
还有就是没代码真心不知道到底是什么问题。。。。。


本答案仅供参考
   

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
两个人 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

 楼主| 发表于 2015-12-27 10:48:26 | 显示全部楼层
//string1.h
#include<iostream>
using std::ostream;
using std::istream;
class String
{
private:
        char *CHAR;
        int INT;
public:
        String();
        ~String();
        String(const char*);//String ax("avcd")或String ax="abcd"
        String(const String &);//复制构造函数。
        String & operator=(const String &);
        String & operator=(const char *);
        friend ostream &operator<<(ostream &,const String &);
        friend istream &operator>>(istream &,const String &);
        friend String operator+(const char *,const String &);
        friend String operator+(const String &,const String &);
        char &operator[](int );
        bool operator==(const String &);
        void Stringup();
        void Stringlow();
        int has(const char);
};
//string2.cpp
#include<string.h>
#include<cctype>
#include"String1.h"
using std::cout;
using std::cin;

String::String()
{

CHAR=new char[0];
INT=0;
}
String::~String()
{
delete [] CHAR;
cout<<"析构CHAR\n";
}
String::String(const char*c_r)
{
INT=strlen(c_r);
CHAR=new char[INT+1];
strcpy(CHAR,c_r);
}
String::String(const String &s1)
{
        delete [] CHAR;
        INT=strlen(s1.CHAR);
        CHAR=new char[INT+1];
        strcpy(CHAR,s1.CHAR);
}
String &String::operator=(const String &s2)
{
delete [] CHAR;
INT=strlen(s2.CHAR);
CHAR=new char[INT +1];
strcpy(CHAR,s2.CHAR);
return *this;
}
String &String::operator=(const char*s3)
{
delete [] CHAR;
INT=strlen(s3);
CHAR=new char[INT+1];
strcpy(CHAR,s3);
return *this;
}
ostream &operator<<(ostream &os,const String &s4)
{
        os<<s4;
        return os;
}
istream &operator>>(istream &on,String &s5)
{

        char ip[100];
        on.get(ip,100);
        if(cin)
        s5=ip;
        while(cin&&cin.get()!='\n')
        {
                continue;
        }
        return on;
}
void String::Stringup()
{
        for(int i=0;i<=INT;i++)
        {
                cout<<tolower(CHAR[i]);
        }
}
void String::Stringlow()
{
for(int i=0;i<=INT;i++)
{
cout<<toupper(CHAR[i]);
}
}
bool String::operator==(const String &s6)
{
if(INT==s6.INT)
        return true;
else
return false;
}
String operator+(const String &s7,const String&s8)
{
        const int i=s7.INT+s8.INT;
        char *ip=new char[i+1];
        strcpy(ip,s7.CHAR);
        strcat(ip,s7.CHAR);
        String io;
        io=ip;
        return io;
}
String operator+(const char*ip,const String &s9)
{
       
        int i=strlen(ip);
        i+=s9.INT;
        char *ppc=new char[i+1];
        strcpy(ppc,ip);
        std::strcat(ppc,s9.CHAR);
        String io;
        io=ppc;
        return io;
}
int String::has(const char o)
{
        int ii=0;
        for(int i=0;i<=INT;i++)
        {
        if(CHAR[i]==o)
                ii++;
        }
        return ii;
}
//string.cpp
#include "stdafx.h"
#include<iostream>
#include"String2.cpp"
using namespace std;
int main()
{
        String s1("and I am a c++ student.");
        String s2="please enter your name";
        String s3;
        cout << s2;
        cin>>s3;
        s2="my name is "+s3;
        cout<<s2<<".\n";
        s2=s2+s1;
        s2.Stringup();
        cout<<"the sting\n"<<s2<<"\ncontains"<<s2.has('A')<<"'A'characters in it.\n";
        s1="red";
        String rgb[3]={String(s1),String("green"),String("blue")};
        cout<<"enter the name of a primary color for mixing light";
        String ans;
        bool success=false;
        while(cin>>ans)
        {
                ans.Stringup();
                for(int i=0;i<3;i++)
                {
                if(ans==rgb[i])
                {
                cout<<"that's right!\n";
                success=true;
                break;
                }
                }
                if(success)
                        break;
                else
                        cout<<"try again\n";
        }
        cout<<"bye\n";
return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-12-27 10:50:43 | 显示全部楼层
阴影中的曙光 发表于 2015-12-27 08:29
你的编译器是vc吧,vs就应该是支持strcpy_s的,他们出现主要因为那些C库的函数,很多函数内部是不进行参数 ...

你好,现在让我捣弄了一下不出现那个问题了。有出现了新问题:1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string.h(110): error C2733: “strcpy”: 不允许重载函数的第二个 C 链接
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\string.h(107) : 参见“strcpy”的声明
怎么解决啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-27 12:23:06 | 显示全部楼层
用strtcpy_s 函数的时候,引用一下
#include <string.h>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-12-27 12:31:48 | 显示全部楼层
康小泡 发表于 2015-12-27 12:23
用strtcpy_s 函数的时候,引用一下

不行啊,换了代码之后就。1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string.h(110): error C2733: “strcpy”: 不允许重载函数的第二个 C 链接
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\string.h(107) : 参见“strcpy”的声明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-12-27 12:34:04 | 显示全部楼层
康小泡 发表于 2015-12-27 12:23
用strtcpy_s 函数的时候,引用一下

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

使用道具 举报

发表于 2015-12-27 12:38:10 | 显示全部楼层

不可以引用#include <string.h>?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-12-27 12:50:45 | 显示全部楼层
康小泡 发表于 2015-12-27 12:38
不可以引用#include ?

嗯 是的!引用过后就出现:1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\string.h(110): error C2733: “strcpy”: 不允许重载函数的第二个 C 链接
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\string.h(107) : 参见“strcpy”的声明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-27 13:52:04 | 显示全部楼层
//string.cpp
#include "stdafx.h"
#include<iostream>
#include"String1.h" // 小伙 是你们老师教你include .cpp文件嘛!
using namespace std;
int main()
{
        String s1("and I am a c++ student.");
        String s2="please enter your name";
        String s3;
        cout << s2;
        cin>>s3;
        s2="my name is "+s3;
        cout<<s2<<".\n";
        s2=s2+s1;
        s2.Stringup();
        cout<<"the sting\n"<<s2<<"\ncontains"<<s2.has('A')<<"'A'characters in it.\n";
        s1="red";
        String rgb[3]={String(s1),String("green"),String("blue")};
        cout<<"enter the name of a primary color for mixing light";
        String ans;
        bool success=false;
        while(cin>>ans)
        {
                ans.Stringup();
                for(int i=0;i<3;i++)
                {
                if(ans==rgb[i])
                {
                cout<<"that's right!\n";
                success=true;
                break;
                }
                }
                if(success)
                        break;
                else
                        cout<<"try again\n";
        }
        cout<<"bye\n";
return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-27 13:59:37 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-12-27 14:03 编辑

一个.cpp或者.c是一个编译单元 对应一个.obj文件
连接的时候如果需要调用非本链接单元的函数 包含别的编译单元的对应头文件即可
千万不要直接include .cpp 链接会各种报错

函数可以多次声明, 但只能一个函数去实现他, 超过一个, 编译器就无法识别到底去对应哪个函数体
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-12-27 16:45:50 | 显示全部楼层
ryxcaixia 发表于 2015-12-27 13:59
一个.cpp或者.c是一个编译单元 对应一个.obj文件
连接的时候如果需要调用非本链接单元的函数 包含别的编译 ...

我改了以后又出现:
1>string.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall String::String(void)" (??0String@@QAE@XZ),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall String::~String(void)" (??1String@@QAE@XZ),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall String::String(char const *)" (??0String@@QAE@PBD@Z),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall String::String(class String const &)" (??0String@@QAE@ABV0@@Z),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "public: class String & __thiscall String::operator=(class String const &)" (??4String@@QAEAAV0@ABV0@@Z),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "public: class String & __thiscall String::operator=(char const *)" (??4String@@QAEAAV0@PBD@Z),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class String const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVString@@@Z),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class String const &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@ABVString@@@Z),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "class String __cdecl operator+(char const *,class String const &)" (??H@YA?AVString@@PBDABV0@@Z),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "class String __cdecl operator+(class String const &,class String const &)" (??H@YA?AVString@@ABV0@0@Z),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall String::operator==(class String const &)" (??8String@@QAE_NABV0@@Z),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall String::Stringup(void)" (?Stringup@String@@QAEXXZ),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall String::Stringlow(void)" (?Stringlow@String@@QAEXXZ),该符号在函数 _main 中被引用
1>string.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall String::has(char)" (?has@String@@QAEHD@Z),该符号在函数 _main 中被引用
1>d:\用户目录\我的文档\visual studio 2012\Projects\string\Debug\string.exe : fatal error LNK1120: 14 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-27 17:15:56 | 显示全部楼层
我改过之后是可以编译的
亲 你把你的工程文件上传上来  我看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-12-27 17:36:57 | 显示全部楼层
ryxcaixia 发表于 2015-12-27 17:15
我改过之后是可以编译的
亲 你把你的工程文件上传上来  我看看

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

使用道具 举报

 楼主| 发表于 2015-12-27 17:37:49 | 显示全部楼层
ryxcaixia 发表于 2015-12-27 17:15
我改过之后是可以编译的
亲 你把你的工程文件上传上来  我看看

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

使用道具 举报

发表于 2015-12-27 17:38:28 | 显示全部楼层
楼主完美主义者啊。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-12-27 17:52:26 | 显示全部楼层
ryxcaixia 发表于 2015-12-27 17:15
我改过之后是可以编译的
亲 你把你的工程文件上传上来  我看看

//string2.h
#ifndef String1_H_
#define String1_H_
#include<iostream>
using std::ostream;
using std::istream;
class String
{
private:
        char *CHAR;
        int INT;
public:
        String();
        ~String();
        String(const char*);//String ax("avcd")或String ax="abcd"
        String(const String &);//复制构造函数。
        String & operator=(const String &);
        String & operator=(const char *);
        friend ostream &operator<<(ostream &,const String &);
        friend istream &operator>>(istream &,const  String &);
        friend String operator+(const char *,const String &);
        friend String operator+(const String &,const String &);
        char &operator[](int );
        bool operator==(const String &);
        void Stringup();
        void Stringlow();
        int has(const char);
};
#endif


//string1.cpp
#include<cctype>
#include"string2.h"
using std::cout;
using std::cin;

String::String()
{

CHAR=new char[0];
INT=0;
}
String::~String()
{
delete [] CHAR;
cout<<"析构CHAR\n";
}
String::String(const char*c_r)
{
INT=strlen(c_r);
CHAR=new char[INT+1];
strcpy(CHAR,c_r);
}
String::String(const String &s1)
{
        delete [] CHAR;
        INT=strlen(s1.CHAR);
        CHAR=new char[INT+1];
        strcpy(CHAR,s1.CHAR);
}
String &String::operator=(const String &s2)
{
delete [] CHAR;
INT=strlen(s2.CHAR);
CHAR=new char[INT +1];
strcpy(CHAR,s2.CHAR);
return *this;
}
String &String::operator=(const char*s3)
{
delete [] CHAR;
INT=strlen(s3);
CHAR=new char[INT+1];
strcpy(CHAR,s3);
return *this;
}
ostream &operator<<(ostream &os,const String &s4)
{
        os<<s4;
        return os;
}
istream &operator>>(istream &on,String &s5)
{

        char ip[100];
        on.get(ip,100);
        if(cin)
        s5=ip;
        while(cin&&cin.get()!='\n')
        {
                continue;
        }
        return on;
}
void String::Stringup()
{
        for(int i=0;i<=INT;i++)
        {
                cout<<tolower(CHAR[i]);
        }
}
void String::Stringlow()
{
for(int i=0;i<=INT;i++)
{
cout<<toupper(CHAR[i]);
}
}
bool String::operator==(const String &s6)
{
if(INT==s6.INT)
        return true;
else
return false;
}
String operator+(const String &s7,const String&s8)
{
        const int i=s7.INT+s8.INT;
        char *ip=new char[i+1];
        strcpy(ip,s7.CHAR);
        strcat(ip,s7.CHAR);
        String io;
        io=ip;
        return io;
}
String operator+(const char*ip,const String &s9)
{
       
        int i=strlen(ip);
        i+=s9.INT;
        char *ppc=new char[i+1];
        strcpy(ppc,ip);
        std::strcat(ppc,s9.CHAR);
        String io;
        io=ppc;
        return io;
}
int String::has(const char o)
{
        int ii=0;
        for(int i=0;i<=INT;i++)
        {
        if(CHAR[i]==o)
                ii++;
        }
        return ii;
}

#include "stdafx.h"
#include<iostream>
#include"string2.h"

using namespace std;
int main()
{
        String s1("and I am a c++ student.");
        String s2="please enter your name";
        String s3;
        cout << s2;
        cin>>s3;
        s2="my name is "+s3;
        cout<<s2<<".\n";
        s2=s2+s1;
        s2.Stringup();
        cout<<"the sting\n"<<s2<<"\ncontains"<<s2.has('A')<<"'A'characters in it.\n";
        s1="red";
        String rgb[3]={String(s1),String("green"),String("blue")};
        cout<<"enter the name of a primary color for mixing light";
        String ans;
        bool success=false;
        while(cin>>ans)
        {
                ans.Stringlow();
                for(int i=0;i<3;i++)
                {
                if(ans==rgb[i])
                {
                cout<<"that's right!\n";
                success=true;
                break;
                }
                }
                if(success)
                        break;
                else
                        cout<<"try again\n";
        }
        cout<<"bye\n";
return 0;
}

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

使用道具 举报

 楼主| 发表于 2015-12-27 18:20:53 | 显示全部楼层
在线等。:mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 16:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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