在C++中如何调用C的同名函数

时间:2022-09-22 09:11:49
学校布置了一个上机题目,就是要定义一个STRING类,里面定义了一些操作,然后这些操作的名字都是和C同名的函数,
比如strlen,strcpy……
然后要求是要调用C的同名函数来实现,也就是C库中的strlen,strcpy…………
可是在实际调用的过程中,显示错误信息是无法传递参数,我猜想是因为无法区分这两个函数,
于是我想到了用命名空间来区分,将C库的函数限定在std空间来访问,可是 结果不行,想请各位大侠指教。
附上代码(还未完成,但是上面的这个问题没解决无法做下去了):

#include<iostream>
#include<string>
using std::cout;
extern "C" size_t strlen(const char *);
char *strcat(char *destin, char *source); 
 int strcmp(char *str1, char *str2); 
 char *strcpy(char *str1, char *str2);  

class STRING{
char *str;
public:
int strlen() const;
int strcmp(const STRING&) const;
STRING &strcpy(const STRING &) const;
STRING &strcat(const STRING &);
STRING(char *);
~STRING();
};

int STRING::strlen() const
{
return std::strlen(str);
}

int STRING::strcmp(const STRING& bstr) const
{
return std::strcmp(this->str,bstr.str);
}
STRING &strcpy(const STRING &bstr) const
{
std::strcpy(this->str,bstr.str);
return *this;
}

STRING &strcat(const STRING &bstr)
{
std::strcat(this->str,bstr.str);
}

STRING::STRING(char *strstr)
{
str = new char[strcpy(strstr)+1];
std::strcpy(str,strstr);
}

STRING::~STRING()
{
delete str;
}



void main()
{
STRING s1("I like apple");
STRING s2("and peat");
STRING s3("and orange");
cout << "Length of s1=" << s1.strlen()<< "\n";
s1.strcat(s2).strcat(s3);
cout << "Length of s1=" << s1.strlen() << "\n";
s3.strcpy(s2).strcpy(s1);
cout << "Length of s3=" << s3.strlen() << "\n";
}

8 个解决方案

#1


用::运算符调用。

#2


C库中的函数你只要将库的头文件包含进来就可以使用了啊

#3


#include<string.h>,将对应的头文件包含进来就行。

#4


像这样c++的string和c的string.h不冲突
#include <iostream> 
#include <string>
#include <string.h>
using namespace std; 

void main() 

char a[]="hello world!";
string s=a;
cout<<s<<" "<<strlen(a)<<endl;
}

#5


#include<cstring>
#include<cstdio>
#include<cstdlib>
...................

#6


引用 1 楼 tony_chenypc 的回复:
用::运算符调用。


如何引用?上面我的那个作用域运算符对吗?

#7


引用 5 楼 lovesi3344 的回复:
#include <cstring>
#include <cstdio>
#include <cstdlib>
...................


直接用的话不行,会显示如下错误信息:

\string.cpp(20) : error C2660: “STRING::strlen”: 函数不接受 1 个参数
1>.\string.cpp(25) : error C2660: “STRING::strcmp”: 函数不接受 2 个参数
1>.\string.cpp(28) : error C2270: “strcpy”: 非成员函数上不允许修饰符
1>.\string.cpp(29) : error C2673: “strcpy”: 全局函数没有“this”指针
1>.\string.cpp(29) : error C2227: “->str”的左边必须指向类/结构/联合/泛型类型
1>.\string.cpp(29) : error C2248: “STRING::str”: 无法访问 private 成员(在“STRING”类中声明)
1>        .\string.cpp(8) : 参见“STRING::str”的声明
1>        .\string.cpp(7) : 参见“STRING”的声明
1>.\string.cpp(30) : error C2673: “strcpy”: 全局函数没有“this”指针
1>.\string.cpp(35) : error C2673: “strcat”: 全局函数没有“this”指针
1>.\string.cpp(35) : error C2227: “->str”的左边必须指向类/结构/联合/泛型类型
1>.\string.cpp(35) : error C2248: “STRING::str”: 无法访问 private 成员(在“STRING”类中声明)
1>        .\string.cpp(8) : 参见“STRING::str”的声明
1>        .\string.cpp(7) : 参见“STRING”的声明
1>.\string.cpp(40) : error C2784: “std::_String_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_iterator<_Elem,_Traits,_Alloc>)”: 无法从“int”为“std::_String_iterator<_Elem,_Traits,_Alloc>”推导 模板 参数
1>        D:\Program Files\Microsoft Visual Studio 8\VC\include\xstring(438) : 参见“std::operator +”的声明
1>.\string.cpp(40) : error C2784: “std::_String_const_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_const_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_const_iterator<_Elem,_Traits,_Alloc>)”: 无法从“int”为“std::_String_const_iterator<_Elem,_Traits,_Alloc>”推导 模板 参数
1>        D:\Program Files\Microsoft Visual Studio 8\VC\include\xstring(298) : 参见“std::operator +”的声明
1>.\string.cpp(40) : error C2784: “std::reverse_iterator<_RanIt> std::operator +(_Diff,const std::reverse_iterator<_RanIt> &)”: 无法从“int”为“const std::reverse_iterator<_RanIt> &”推导 模板 参数
1>        D:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1809) : 参见“std::operator +”的声明
1>.\string.cpp(40) : error C2676: 二进制“+”: “STRING”不定义该运算符或到预定义运算符可接收的类型的转换
1>.\string.cpp(41) : warning C4996: “strcpy”被声明为否决的

#8


引用 4 楼 cattycat 的回复:
像这样c++的string和c的string.h不冲突
C/C++ code#include<iostream> 
#include<string>
#include<string.h>usingnamespace std;void main() 
{char a[]="hello world!";string s=a;
    cout<<s<<""<<strlen(a)<<endl;
}


现在的问题是我定义的函数和它自带的函数同名,如果我在同名的函数中调用同名的C函数,会陷入自身调用的循环中,虽然我觉得编译器应该可以识别,可是结果却是它不认识C库函数。然后显示不接受一个形参。
即使刚刚加入了cstring头文件也一样。

#1


用::运算符调用。

#2


C库中的函数你只要将库的头文件包含进来就可以使用了啊

#3


#include<string.h>,将对应的头文件包含进来就行。

#4


像这样c++的string和c的string.h不冲突
#include <iostream> 
#include <string>
#include <string.h>
using namespace std; 

void main() 

char a[]="hello world!";
string s=a;
cout<<s<<" "<<strlen(a)<<endl;
}

#5


#include<cstring>
#include<cstdio>
#include<cstdlib>
...................

#6


引用 1 楼 tony_chenypc 的回复:
用::运算符调用。


如何引用?上面我的那个作用域运算符对吗?

#7


引用 5 楼 lovesi3344 的回复:
#include <cstring>
#include <cstdio>
#include <cstdlib>
...................


直接用的话不行,会显示如下错误信息:

\string.cpp(20) : error C2660: “STRING::strlen”: 函数不接受 1 个参数
1>.\string.cpp(25) : error C2660: “STRING::strcmp”: 函数不接受 2 个参数
1>.\string.cpp(28) : error C2270: “strcpy”: 非成员函数上不允许修饰符
1>.\string.cpp(29) : error C2673: “strcpy”: 全局函数没有“this”指针
1>.\string.cpp(29) : error C2227: “->str”的左边必须指向类/结构/联合/泛型类型
1>.\string.cpp(29) : error C2248: “STRING::str”: 无法访问 private 成员(在“STRING”类中声明)
1>        .\string.cpp(8) : 参见“STRING::str”的声明
1>        .\string.cpp(7) : 参见“STRING”的声明
1>.\string.cpp(30) : error C2673: “strcpy”: 全局函数没有“this”指针
1>.\string.cpp(35) : error C2673: “strcat”: 全局函数没有“this”指针
1>.\string.cpp(35) : error C2227: “->str”的左边必须指向类/结构/联合/泛型类型
1>.\string.cpp(35) : error C2248: “STRING::str”: 无法访问 private 成员(在“STRING”类中声明)
1>        .\string.cpp(8) : 参见“STRING::str”的声明
1>        .\string.cpp(7) : 参见“STRING”的声明
1>.\string.cpp(40) : error C2784: “std::_String_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_iterator<_Elem,_Traits,_Alloc>)”: 无法从“int”为“std::_String_iterator<_Elem,_Traits,_Alloc>”推导 模板 参数
1>        D:\Program Files\Microsoft Visual Studio 8\VC\include\xstring(438) : 参见“std::operator +”的声明
1>.\string.cpp(40) : error C2784: “std::_String_const_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_const_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_const_iterator<_Elem,_Traits,_Alloc>)”: 无法从“int”为“std::_String_const_iterator<_Elem,_Traits,_Alloc>”推导 模板 参数
1>        D:\Program Files\Microsoft Visual Studio 8\VC\include\xstring(298) : 参见“std::operator +”的声明
1>.\string.cpp(40) : error C2784: “std::reverse_iterator<_RanIt> std::operator +(_Diff,const std::reverse_iterator<_RanIt> &)”: 无法从“int”为“const std::reverse_iterator<_RanIt> &”推导 模板 参数
1>        D:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1809) : 参见“std::operator +”的声明
1>.\string.cpp(40) : error C2676: 二进制“+”: “STRING”不定义该运算符或到预定义运算符可接收的类型的转换
1>.\string.cpp(41) : warning C4996: “strcpy”被声明为否决的

#8


引用 4 楼 cattycat 的回复:
像这样c++的string和c的string.h不冲突
C/C++ code#include<iostream> 
#include<string>
#include<string.h>usingnamespace std;void main() 
{char a[]="hello world!";string s=a;
    cout<<s<<""<<strlen(a)<<endl;
}


现在的问题是我定义的函数和它自带的函数同名,如果我在同名的函数中调用同名的C函数,会陷入自身调用的循环中,虽然我觉得编译器应该可以识别,可是结果却是它不认识C库函数。然后显示不接受一个形参。
即使刚刚加入了cstring头文件也一样。