文字列操作関数について – プログラミング – Home

文字列操作関数について
 
通知
すべてクリア

[解決済] 文字列操作関数について


うーん
 うーん
(@うーん)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

ひどく初歩的な質問ですいません。
char str[]=ABCFGH;
char substr[]=DE;
という、文字列から、ABCDEFGHという文字列を作りたいのですが、どの様にしたらい
いでしょう?
strの4文字目にsubstrを挿入したいのです。

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

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


引用未解決
トピックタグ
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

動作確認していません(念のため)。

------------------------------------------
予め上限サイズがわかっているなら、それより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;


返信引用
うーん
 うーん
(@うーん)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

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')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

> 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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

編集元を変更可能ならば挿入分ずらして上書きするとか。

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


返信引用
とおりすがり
 とおりすがり
(@とおりすがり)
ゲスト
結合: 23年前
投稿: 180
 

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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

削除もあったのみてなかった。

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等)


返信引用
うーん
 うーん
(@うーん)
ゲスト
結合: 18年前
投稿: 16
Topic starter  

皆さん有り難うございます。
memcpyか、stringクラスを使うと良いのですね。
どちらの方法でも上手くいきました。有り難うございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました