0

对于某些函数,我想在函数中创建字符串的副本,然后对其进行操作 - 出于某种奇怪的原因,我无法让 strcpy 工作(给我一个分段错误) - 我也尝试将 arg 作为字符串传递,这也不起作用(g++ 抛出一个错误,说它需要一个字符 *)

#include <iostream>
#include <cstring>

using namespace std;
void copy_string(char* stri);

int main ()
{
  copy_string("sample string");

  return 0;
}

void copy_string(char* stri) {
  char* stri_copy;

  strcpy(stri_copy, stri);

  cout << "String: " << stri_copy;

}

我不确定我理解为什么会这样。

所以我的两个问题是:

  1. 为什么会发生这种情况 - 有没有简单的解决方法?
  2. 创建传递给函数的字符串的本地副本的最简单/最有效的方法是什么?

谢谢!

4

7 回答 7

7
 char* stri_copy;

 stri_copy = (char*)malloc(strlen(stri) * sizeof(char) + 1); 
 strcpy(stri_copy, stri);

您没有为 stri_copy 分配空间。

于 2009-12-28T17:46:04.220 回答
4

指向 stri_copy 的指针尚未被 malloc 处理。使用strdup下面将解决问题并相应地为 的值分配内存stri

char* stri_copy;
stri_copy = strdup(stri);

希望这会有所帮助,最好的问候,汤姆。

于 2009-12-28T17:48:23.710 回答
3

我不知道这是否是您正在寻找的,但我让它与字符串一起使用。

#include <iostream>
#include <cstring>
#include <string.h>
using namespace std;
void copy_string(string);

int main ()
{  
  copy_string("sample string");

  return 0;
}

void copy_string(string stri) {
  string cpy = stri;
  cout << "String: " << cpy;

}
于 2009-12-28T18:02:58.860 回答
1
char* stri_copy;
strcpy(stri_copy, stri);

问题是它stri_copy没有指向有效的内存。strcpy 第一个参数需要正确的内存位置。

int len = strlen(stri);
char* stri_copy = new char[ len + 1];
strncpy(stri_copy, stri, len );
stri_copy[len] = '\0';
于 2009-12-28T17:46:42.813 回答
1

要使用 strcpy,您需要一个已分配内存的缓冲区作为目标。您的 stri_copy 指针没有指向这样的缓冲区。

于 2009-12-28T17:46:50.267 回答
1

您有分段错误,因为 stri_copy 未指向有效内存。

如果你可以使用 STL,那么你可以有办法做到这一点:

void copy_string(const std::string& stri) {
  char* stri_copy= stri.c_str();

  // work with the copy of the string

  std::cout << "String: " << stri_copy;

}

std::string复制字符串参数并在完成后为您处理该副本

编辑: 用作const std::string&参数类型。

于 2009-12-28T17:50:58.743 回答
0

strcpy 不分配任何存储来保存结果。您使用“随机”指针作为目标,这就是您看到段错误的原因。strcpy 的一个非常简单的实现看起来像

void naivestrcpy(char* destination, const char* source) {
   while(*source) *destination++ = *source++;
   *destination = 0;
}

strcpy 完全按照它在锡上所说的去做,它会复制。它不能确保您已将正确尺寸的纸张装入施乐纸盒。

于 2009-12-28T17:49:59.057 回答