【问题标题】:exception of strcpy function in c++ console programc++控制台程序中strcpy函数的异常
【发布时间】:2013-08-14 06:43:30
【问题描述】:

strcpy() 中的异常;

void recid(string str,int *begin, int *end)
{
  char *f,*str2;

  const char c1[2]=":",c2[2]="-";
  strcpy(str2,str.c_str());
  f=strtok(str2,c1);
  f=strtok(NULL,c2);
  *begin=atoi(f);
  f=strtok(NULL,c2);
  *end=atoi(f);
}

你能帮我解决吗?

【问题讨论】:

  • 什么异常?你的意思是段错误?另外,为什么在 C++ 中使用 C 字符串函数?如果您不知道自己在做什么以及为什么,那通常是个坏主意。还有一个问题是,str2 是未初始化的指针。
  • 你的问题是抛出不显示异常的异常...

标签: c++ exception strcpy


【解决方案1】:

str2 是一个未初始化的指针。 strcpy 不分配内存,因此当前正在尝试写入您不拥有的任意地址,并且您的代码很可能无法写入。

在调用strcpy之前,您需要将str2指向有效内存。

str2 = (char*)malloc(str.size()+1);
strcpy(str2,str.c_str());

你也应该在你的程序后面free内存

free(str2); // cannot dereference str2 after this point

【讨论】:

  • 谢谢,但它会产生一个错误 invalid conversion from void* to char*
  • @NadiaBarjaste 我已经用缺少的演员更新了我的答案。 (我忘了 C++ 需要强制转换;它不是必需的,在 C 中不鼓励使用)
【解决方案2】:

问题是您通过未初始化 str2 来写入未初始化/随机内存位置。

第一个解决方案:

str2 = new char[str.size() + 1];
strcpy(str2, str.c_str());
...
delete[] str2.

第二个(更好的解决方案):不要在代码中使用指针,除非你必须这样做:

std::string str2 = str1;

另外,考虑使用 std::ostringstream 将标记化为 std::strings 并转换为 int。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 2012-11-02
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多