2010-11-21 18 views
2

文字列を別の文字列に効率的に挿入する

char aa[] = { "Hello, !" };

char bb[] = { "World" };

bstをcstringで最も効率的に挿入する方法は?

+0

**なぜ**あなたはむしろcstringを使用しますか? – SLaks

+0

なぜ 'C'と' C++'タグの両方を持っていますか?これはC++の質問で、Cの質問ではないようですね? –

+0

"World"を "Hello、!"に挿入する最も最適で速い方法。 "Hello World!"を作るそれをハードコードすることです: 'char cc [] =" Hello、World! "'。私はそれを別に言いたいと思っています! –

答えて

10
  • 十分に大きいバッファ(malloc/new[]
  • を割り当てるは
  • strncpy/memcpy)バッファにAA列の最初の部分をコピーBB列(strcpy/memcpy
  • にコピーをコピーします残りの文字列(strncpy/memcpy
3
std::string aa = "Hello, !"; 
std::string bb = "World"; 
aa.insert(7, bb); 

は、なぜあなたはC++としてこれをタグ付けされているC++

からのwannaの使用文字列をいけませんか?

+0

確かに......... –

+0

はうまく動作します。ありがとう –

7

通常、最大限の最適化では、特定の要件を利用する必要があります。速度(または他のメトリック)を得るためには、コードの汎用性が低くなります。私たちが推測しなければならない間に、あなたがカットできるコーナーを知っているかもしれません。以下

コード断片は、これらのヘッダを使用します。

#include <stdio.h> 
#include <string.h> 

あなたはパフォーマンスを最大化したい場合は、それが最終的に文字列、後挿入のため事前に割り当てる十分なスペースに役立つだろう:

#define MAX_STR_LEN 256 

char aa[MAX_STR_LEN] = "Hello, !"; 
char bb[] = "World"; 

挿入する場所をどのように知っているかは明示していません。コピー先の文字列へのオフセットとしての私のサンプルコードのために私は、挿入ポイントを定義します。

size_t pos = 7; 

事前に文字列の長さのいずれかを知っている場合は、文字列をスキャンしなければならないはstrlenを呼び出すのconstの代わりに、使用する必要があります。ここで私はあなたがその幸運だとは思わない。

size_t srclen = strlen(bb); 

memmove機能が適切に重複送信元と送信先に処理します。

// +1 for count to include terminating null 
memmove(aa+pos+srclen, aa+pos, strlen(aa)-pos+1); 

memcpyを速くいくつかのプラットフォーム上で、安全に文字列の間でコピーすることができます。

memcpy(aa+pos, bb, srclen); 

aaは含まれてい結果。

あなたがして、必要なサイズにaaを事前に割り当てることができない場合は、次の

// additional include for malloc 
#include <stdlib.h> 

char aa[] = "Hello, !"; 
char bb[] = "World"; 
size_t pos = 7;  

size_t srclen = strlen(bb); 
size_t dstlen = strlen(aa); 
char *m = malloc(srclen+dstlen+1); 
// Test for NULL or use an allocator that throws 

memcpy(m, aa, pos); 
memcpy(m+pos, bb, srclen); 
memcpy(m+pos+srclen, aa+pos, dstlen-pos+1); 

mは、結果が含まれており、おそらくfreeにする必要がある「D最終的に。

バッファオーバーフローの可能性がある場合は、メモリ破損やセキュリティ上の脆弱性を避けるために、長さをチェックする必要があります。

こちらがお役に立てば幸いです。

+0

これは私がサーフしたものです。それは本当に助けになりました。 +1情報を明確にするために –

1

char * newStr = malloc(strlen(aa)+ strlen(bb));

sprintf(newStr、 "%s%s"、aa、bb);