0

特定の関数について、関数内で文字列のコピーを作成し、これを操作したい - 何らかの奇妙な理由で、strcpy を動作させることができない (セグメンテーション違反が発生する) - arg を文字列として渡そうとした、これも機能しません (g++ は、char* が必要であるというエラーをスローします)

#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;

}

なぜこれが起こっているのか理解できません。

私の2つの質問は次のとおりです。

  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 に答える