8

私はこのコードを持っています

  char * oldname = new char[strlen(name) + 1];

  memcpy(oldname,name,strlen(name) + 1);

  name = new char[strlen(oldname) + strlen(r.name) + 1];
  memset(name, '\0', strlen(name));

  strcat(name,oldname);
  strcat(name," ");
  strcat(name,r.name);

memcpy と memset を使用することはできないことは理解していますが、これを C++ で、できれば std なしで使用する方法を正確に理解していません。

誰か知っていますか?ありがとうございました。

4

7 に答える 7

12

一般的に、ありstd::fillます。http://www.cplusplus.com/reference/algorithm/fill/

または、この特定のインスタンスでは、の使用を検討する必要がありますstd::vector<char>

( C++ ではあまり慣用的ではありませんが、memsetを使用する場合は C++ でも使用できることに注意してください。)#include <cstring>

于 2010-01-24T22:31:30.537 に答える
11

memsetオブジェクト型の配列がある場合の1 つの可能な代替は、std::fillアルゴリズムを使用することです。これは、反復子の範囲と、配列へのポインターでも機能します。

memcpy呼び出しは、通常、への呼び出しに置き換えることができますstd::copy

例えば

std::copy(name, name + strlen(name) + 1, oldname);
// ...
std::fill(name, name + strlen(name), '\0');

memsetただし、memcpyまだそこにあり、適切な場合に使用できます。多くの C++ 開発者の観点からするとnew、リソース管理オブジェクトを使用せずに raw を使用することは、おそらくより大きな禁止事項です。メモリの割り当て解除が自動的に行われ、コードがより例外に対して安全になるように、 astd::stringまたは aを使用する方がはるかに優れています。std::vector<char>

于 2010-01-24T22:29:46.673 に答える
2

memcpy と memset を使用することはできないことは理解していますが、これを C++ で、できれば std なしで使用する方法を正確に理解していません。

使用してはいけないわけではなく、適切な場合に使用memcpymemsetます。なぜそれが必要なのですか?

std::copyC++ には、アイテムのセット ( だけでなく、任意の型で機能するchar*) をイテレータから別のイテレータにコピーするものがあります。

于 2010-01-24T22:31:40.313 に答える
2

すべてのメモリ割り当てを自分で手動でコピーして実行しなければならないという不便さを除けば、その C++ コードには何の問題もありません。

ただし、std::stringC++ での for 文字列操作の使用を強くお勧めします。

于 2010-01-24T22:32:41.827 に答える
1

文字列操作だけを行う場合は、string を使用します。

于 2010-01-24T22:30:20.457 に答える
1

a から b にコピーするには、std::copy(src_start,src_end,dest_start)どのインクリメントsrc_startを使用して、一致するまで次の宛先要素にコピーしますsrc_start==src_end

memcpy(oldname,name,strlen(name)+1)
// is the same as
std::copy(name,name+strlen(name)+1,oldname)

.. ただし、POD 以外でも機能し、1 つの要素が 1 バイトを超える場合はバイト長をいじる必要はありません。

ただし、文字列操作だけを行いたい場合は、std::stringクラス (およびstd::wstringワイド char 文字列用) が提供されます。それらを連結するのは次のように簡単です。

std::string s = "name",s2 = ..,s3 = ..;
s = s2+s+s3+"Hello";

strxxxC++ で一連の関数を使用することを妨げるものは何もありませんstd::stringが、STL の残りの部分に切り替えることを強くお勧めします。どちらも完璧ではありませんが、エラーが発生する可能性ははるかに低くなります。

于 2010-01-24T22:33:15.137 に答える
-3
char * oldname = new char[strlen(name) + 1];

    //memcpy(oldname,name,strlen(name) + 1);
    strcpy(oldname,name);

    name = new char[strlen(oldname) + strlen(r.name) + 1];
    //memset(name, '\0', strlen(name));
    name[0] = '\0';

    strcat(name,oldname);
    strcat(name," ");
    strcat(name,r.name);

私は今これを理解しています。将来のすべての訪問者のためにこのコードを貼り付けたかっただけです。コメントされた行は、その下のコメントされていない行と同等です。C はコメント済み、C++ はコメントなし。

于 2010-01-25T19:28:39.813 に答える