【问题标题】:My strcpy_s won't work with my char *pointer, why?我的 strcpy_s 不能与我的 char *pointer 一起使用,为什么?
【发布时间】:2013-12-06 19:32:19
【问题描述】:

好的,所以我正在尝试修复我的 C++ 分配,但是当我使用 strcpy_s 时,它只适用于我的数组而不是我的 *pointer.. 这是我正在使用的:

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”的实例与参数列表参数类型匹配:(char*, char*)”。

【问题讨论】:

  • 可能是个无用的问题,但你为什么不用字符串呢?
  • @Nil,因为书上的作业说要使用 char* 和 Char[]
  • @kenny,我在发帖之前阅读了那个网站;我不明白它在说什么。这就是我在这里发帖的原因。我是初学者。
  • @SyntaxEyes 看看下面 Yu 的回答。它具有标准 strcpy() 或昔日的不同参数或签名。

标签: c++ string strcpy


【解决方案1】:

非标准strcpy_sstd::strcpy 多了一个参数,即您要复制的最大大小。

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

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

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

【讨论】:

  • 当我使用: char *strcpy(char *s1, const char *s2);它输出一堆符号,如“==^&%$@”。但是当我使用时:
  • 但是当我使用:strcpy_s(char *s1, size_t s1max, const char *s2);它可以工作,但在编译结束时会出现“中断”错误或类似的错误。
  • @SyntaxEyes C 风格的字符串需要以空值结尾,请确保这一点。或者更好的是,如果可以,请使用std::string
  • @YuHao,仅供参考 strcpy_s 是标准 C11 函数:en.cppreference.com/w/c/string/byte/strcpy
  • @Annie 这是一个 C++ 问题。
【解决方案2】:

查看文档: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;
}

【讨论】:

  • 这不是我在这里做的:guest = new char[strlen(name) +1];这不是为指针留出空间来保存名称吗?
  • 不,因为你是动态分配内存,你必须告诉函数目标缓冲区有多大。如果你有一个像char s[100]; 这样的静态数组,模板化的重载可以自动确定大小。我在答案中添加了两者的示例。
  • 噢噢噢!我知道了。好的,所以我使用带有 3 个参数的第二个示例,现在编译完成后会弹出一个错误,显示“断点”,然后当我单击“中断”按钮时它会显示中止。
  • 您应该能够在调试器中看到发生错误的行。如果不查看您的所有代码,很难判断问题可能是什么。
  • 在这两个对strcpy_s 的调用中,代码应该检查返回的值。否则,与简单地调用 strcpy 相比,它只提供了一个很小的优势:它将缓冲区溢出替换为数据损坏。
【解决方案3】:

以下应该有效:

strcpy_s(guest, strlen(name), name); //copy second argument into new space

【讨论】:

  • 必须是 strcpy_s(guest, strlen(name)+1, name) 并围绕警告和无论如何引入 strcpy_s 的意图工作。
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 2011-12-25
  • 2020-10-08
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多