2013-11-22 60 views
0

好了,我试图解决我的C++任务,但是当我使用strcpy_s它仅适用于我的阵列,而不是我的*指针。这里就是我一起工作:我的strcpy_s不能用我的char *指针,为什么?

HotelRoom::HotelRoom(char Num[], int cap, double daily, char* name, int Stat) 
{ 
strcpy_s(room_Num, Num); //copy first argument into room_Num[] 
guest = new char[strlen(name) +1]; //create space for the name 
strcpy_s(guest, name); //copy second argument into new space 
capacity = cap; 
dailyRate = daily; 
occupancyStat = Stat; 
} 

这是以这种方式使用它时出现错误strcpy_s(guest,name); :

strcpy_s“没有重载函数实例‘’相匹配的参数列表参数类型有:(字符*,字符*)”。

+1

可能是一个无用的问题,但你为什么不使用字符串? – Nil

+0

不同的功能签名? http://msdn.microsoft.com/en-us/library/td1esda9(v=vs.90).aspx – kenny

+0

@Nil,因为书籍分配说要使用char *和char [] – SyntaxEyes

回答

3

非标准strcpy_s需要一个额外的参数比std::strcpy那就是您想要复制的最大尺寸。

errno_t strcpy_s(char *s1, size_t s1max, const char *s2); 

你需要的是标准C函数std::strcpy

char *strcpy(char *s1, const char *s2); 
+0

: char * strcpy(char * s1,const char * s2); 它输出一串符号,如“== ^&%$ @”。当我使用: – SyntaxEyes

+0

但我使用时: strcpy_s(char * s1,size_t s1max,const char * s2); 它的工作原理,但在编译它的错误与“打破”错误,或类似的东西结束。 – SyntaxEyes

+0

@SyntaxEyes C风格的字符串需要以null结尾,确保这一点。或者更好的是,如果这是一个选项,可以使用'std :: string'。 –

1

在文档看看:http://msdn.microsoft.com/en-us/library/td1esda9%28v=vs.90%29.aspx

时候可以因为一个静态大小的数组没有被传递无法自动确定大小,你必须提供。

#include <string.h> 

int main() 
{ 
    char src[] = "Hello World!\n"; 
    char staticDest[100]; 
    size_t dynamicSize = strlen(src) + 1; 
    char* dynamicDest = new char[dynamicSize]; 

    //Use the overload that can determine the size automatically 
    //because the array size is fixed 
    //template <size_t size> errno_t strcpy_s(char(&strDestination)[size], const char *strSource); 
    strcpy_s(staticDest, src); 

    //Use the overload that requires an additional size parameter because 
    //the memory is dynamically allocated 
    //errno_t strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource); 
    strcpy_s(dynamicDest, dynamicSize, src); 

    return 0; 
} 
+0

是不是我在这里做的: guest = new char [strlen(name)+1]; 是不是让指针保存名称的空间? – SyntaxEyes

+0

不,由于您要动态分配内存,您必须告诉函数目标缓冲区有多大。如果你有一个像char s [100]这样的静态数组,模板化的超载可以自动确定大小。我在答案中增加了一个例子。 –

+0

OOHHH!我懂了。好吧,我用你的第二个例子的3个参数,现在编译完成后,它弹出一个错误,说“断点”,然后说,当我点击“休息”按钮中止。 – SyntaxEyes

0

下面应该工作:

strcpy_s(guest, strlen(name), name); //copy second argument into new space 
相关问题