文字列操作関数について

[戻る]
うーん 2007/02/12(月) 00:55:31
ひどく初歩的な質問ですいません。
char str[]="ABCFGH";
char substr[]="DE";
という、文字列から、"ABCDEFGH"という文字列を作りたいのですが、どの様にしたらい
いでしょう?
strの4文字目にsubstrを挿入したいのです。

また、
cahr str[]="ABC???DEF";
から、"ABCDEF"という文字列を作るにはどうしたらいいのでしょう?strの4文字目から
3文字削除したいのです。

適切な関数がどうしても見つかりません。どうかご教授下さい。

wclrp ( 'o') [HomePage] 2007/02/12(月) 01:15:39
動作確認していません(念のため)。

------------------------------------------
予め上限サイズがわかっているなら、それより1バイト以上多くしたのを用意する
char dest[9];
char str[]="ABCFGH";
char substr[]="DE";

strcpy(dest,str);
strcat(dest,substr);

------------------------------------------
動的に確保するなら
char * dest = NULL;
char str[]="ABCFGH";
char substr[]="DE";

dest = new char[strlen(str) + strlen(substr) + 1];
strcpy(dest,str);
strcat(dest,substr);
そしてdestがいらなくなったら
delete [] dest;

------------------------------------------
char dest[100];
cahr str[]="ABC???DEF";

邪道だけどC/C++の文字列は文字の配列で終わりに0がついたものだから
memcpy(dest,str,3);
memcpy(dest+3,str+6,3);
dest[6]=0;

うーん 2007/02/12(月) 01:27:56
char dest[9];
char str[]="ABCFGH";
char substr[]="DE";

strcpy(dest,str);
strcat(dest,substr);

とすると、dest[] = "ABCDFGHDE"になってしまうのですが。

やはりじぶんでかんすうをつくるしかないですかね。
void strins(char *str,char *substr,char *dest,int n)
{
 int j = 0;
 for(int i = 1; i <= strlen(str); i++)
 {
 dest[i-1+j] = str[i-1];
 dest[i+j] = '\0';
 if(i == n)
  {
  strcat(dest,substr);
  j = strlen(substr);
  }
 }
}

strins(str,substr,dest,3);
とすれば上手くいくのですが、何となくスマートじゃないような。
どう思われますか?

wclrp ( 'o') [HomePage] 2007/02/12(月) 01:32:44
> strの4文字目にsubstrを挿入したいのです。
間違えてた。
文字列を連結してた。

挿入は確か標準では存在しなかったから
数回コピーして挿入するしかないと思う。

char dest[9];
char str[]="ABCFGH";
char substr[]="DE";

memcpy(dest,str,4);
memcpy(dest+4,substr,2);
memcpy(dest+6,str+4,2);
dest[8]=0;

dest+4は、&dest[4]と同じ値になるので、destの5番目の要素のアドレスになる。

Blue 2007/02/12(月) 03:58:39
編集元を変更可能ならば挿入分ずらして上書きするとか。

char* insert(char* str,const char* substr, const int index)
{
    const int substrLen = strlen(substr);
    char* insertPos = &str[index];

    memmove(insertPos + substrLen, insertPos, strlen(insertPos) + 1);
    strncpy(insertPos, substr, substrLen);

    return str;
}


str[9]= "ABCFGH";
char substr[]= "DE";

insert(str, substr, 3);

とおりすがり 2007/02/12(月) 04:00:25
STL使ってもいいなら

char str[] = "ABCFGH";
char substr[] = "DE";
std::string insertStr;
insertStr = str;        // insertStrに"ABCFGH"格納
insertStr.insert(3,substr);    // 4文字目の後に"DE"挿入

char str2[]="ABC???DEF";
std::string deleteStr;
deleteStr = str2;        // deleteStrに"ABC???DEF"格納
deleteStr.erase(3,3);    // 4文字目から3文字削除

Blue 2007/02/12(月) 04:16:14
削除もあったのみてなかった。

char* erase(char* str, const int index, const int len)
{
    char* erasePos = &str[index];

    // +1 は'\0'もコピーするため
    memmove(erasePos, erasePos + len, strlen(erasePos + len) + 1);

    return str;
}

char str[] = "ABC???DEF";
erase(str, 3, 3);

とおりすがりさんもおっしゃっていますが、C++であれば文字列クラスと
呼ばれるものを利用すると便利でしょうね。(MFCならCString等)

うーん 2007/02/12(月) 13:50:42
[[解決]]
皆さん有り難うございます。
memcpyか、stringクラスを使うと良いのですね。
どちらの方法でも上手くいきました。有り難うございます。

古いスレッドには追加発言できません。