strcpy的问题。
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编译即可 你的编译器是vc吧,vs就应该是支持strcpy_s的,他们出现主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。库函数改写例子:
mkdir改写为 _mkdir
fopen”改写为 fopen_s
stricmp改写为 stricmp_s
strcpy改写为strcpy_s
还有就是没代码真心不知道到底是什么问题。。。。。
本答案仅供参考
//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 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”的声明
怎么解决啊? 用strtcpy_s 函数的时候,引用一下
#include <string.h> 康小泡 发表于 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:23
用strtcpy_s 函数的时候,引用一下
我用的是VC0212 两个人 发表于 2015-12-27 12:34
我用的是VC0212
不可以引用#include <string.h>? 康小泡 发表于 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”的声明 //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 14:03 编辑
一个.cpp或者.c是一个编译单元 对应一个.obj文件
连接的时候如果需要调用非本链接单元的函数 包含别的编译单元的对应头文件即可
千万不要直接include .cpp 链接会各种报错
函数可以多次声明, 但只能一个函数去实现他, 超过一个, 编译器就无法识别到底去对应哪个函数体 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
我改过之后是可以编译的
亲 你把你的工程文件上传上来我看看
怎么传啊? ryxcaixia 发表于 2015-12-27 17:15
我改过之后是可以编译的
亲 你把你的工程文件上传上来我看看
怎么传啊? {:9_229:}楼主完美主义者啊。。。。 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;
}
在线等。:mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad::mad:
页:
[1]