两个人 发表于 2015-12-27 02:51:51

strcpy的问题。

error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation,
在用strcpy的时候提示这个。strcpy_s()又不在std里。该怎么解决??

ryxcaixia 发表于 2015-12-27 02:51:52



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

我用的是vs2010

如果你那边不支持 直接用这个.h 和.cpp编译即可

阴影中的曙光 发表于 2015-12-27 08:29:18

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


本答案仅供参考
   

两个人 发表于 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;
INT=0;
}
String::~String()
{
delete [] CHAR;
cout<<"析构CHAR\n";
}
String::String(const char*c_r)
{
INT=strlen(c_r);
CHAR=new char;
strcpy(CHAR,c_r);
}
String::String(const String &s1)
{
        delete [] CHAR;
        INT=strlen(s1.CHAR);
        CHAR=new char;
        strcpy(CHAR,s1.CHAR);
}
String &String::operator=(const String &s2)
{
delete [] CHAR;
INT=strlen(s2.CHAR);
CHAR=new char;
strcpy(CHAR,s2.CHAR);
return *this;
}
String &String::operator=(const char*s3)
{
delete [] CHAR;
INT=strlen(s3);
CHAR=new char;
strcpy(CHAR,s3);
return *this;
}
ostream &operator<<(ostream &os,const String &s4)
{
        os<<s4;
        return os;
}
istream &operator>>(istream &on,String &s5)
{

        char ip;
        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);
        }
}
void String::Stringlow()
{
for(int i=0;i<=INT;i++)
{
cout<<toupper(CHAR);
}
}
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;
        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;
        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==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={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)
                {
                cout<<"that's right!\n";
                success=true;
                break;
                }
                }
                if(success)
                        break;
                else
                        cout<<"try again\n";
        }
        cout<<"bye\n";
return 0;
}

两个人 发表于 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”的声明
怎么解决啊?

康小泡 发表于 2015-12-27 12:23:06

用strtcpy_s 函数的时候,引用一下
#include <string.h>

两个人 发表于 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”的声明

两个人 发表于 2015-12-27 12:34:04

康小泡 发表于 2015-12-27 12:23
用strtcpy_s 函数的时候,引用一下

我用的是VC0212

康小泡 发表于 2015-12-27 12:38:10

两个人 发表于 2015-12-27 12:34
我用的是VC0212

不可以引用#include <string.h>?

两个人 发表于 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”的声明

ryxcaixia 发表于 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={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)
                {
                cout<<"that's right!\n";
                success=true;
                break;
                }
                }
                if(success)
                        break;
                else
                        cout<<"try again\n";
      }
      cout<<"bye\n";
return 0;
}

ryxcaixia 发表于 2015-12-27 13:59:37

本帖最后由 ryxcaixia 于 2015-12-27 14:03 编辑

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

函数可以多次声明, 但只能一个函数去实现他, 超过一个, 编译器就无法识别到底去对应哪个函数体

两个人 发表于 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 个 ==========

ryxcaixia 发表于 2015-12-27 17:15:56

我改过之后是可以编译的
亲 你把你的工程文件上传上来我看看

两个人 发表于 2015-12-27 17:36:57

ryxcaixia 发表于 2015-12-27 17:15
我改过之后是可以编译的
亲 你把你的工程文件上传上来我看看

怎么传啊?

两个人 发表于 2015-12-27 17:37:49

ryxcaixia 发表于 2015-12-27 17:15
我改过之后是可以编译的
亲 你把你的工程文件上传上来我看看

怎么传啊?

无名侠 发表于 2015-12-27 17:38:28

{:9_229:}楼主完美主义者啊。。。。

两个人 发表于 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 &,constString &);
        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;
INT=0;
}
String::~String()
{
delete [] CHAR;
cout<<"析构CHAR\n";
}
String::String(const char*c_r)
{
INT=strlen(c_r);
CHAR=new char;
strcpy(CHAR,c_r);
}
String::String(const String &s1)
{
        delete [] CHAR;
        INT=strlen(s1.CHAR);
        CHAR=new char;
        strcpy(CHAR,s1.CHAR);
}
String &String::operator=(const String &s2)
{
delete [] CHAR;
INT=strlen(s2.CHAR);
CHAR=new char;
strcpy(CHAR,s2.CHAR);
return *this;
}
String &String::operator=(const char*s3)
{
delete [] CHAR;
INT=strlen(s3);
CHAR=new char;
strcpy(CHAR,s3);
return *this;
}
ostream &operator<<(ostream &os,const String &s4)
{
        os<<s4;
        return os;
}
istream &operator>>(istream &on,String &s5)
{

        char ip;
        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);
        }
}
void String::Stringlow()
{
for(int i=0;i<=INT;i++)
{
cout<<toupper(CHAR);
}
}
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;
        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;
        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==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={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)
                {
                cout<<"that's right!\n";
                success=true;
                break;
                }
                }
                if(success)
                        break;
                else
                        cout<<"try again\n";
        }
        cout<<"bye\n";
return 0;
}

两个人 发表于 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:
页: [1]
查看完整版本: strcpy的问题。