ひどく初歩的な質問ですいません。
char str[]=ABCFGH;
char substr[]=DE;
という、文字列から、ABCDEFGHという文字列を作りたいのですが、どの様にしたらい
いでしょう?
strの4文字目にsubstrを挿入したいのです。
また、
cahr str[]=ABC???DEF;
から、ABCDEFという文字列を作るにはどうしたらいいのでしょう?strの4文字目から
3文字削除したいのです。
適切な関数がどうしても見つかりません。どうかご教授下さい。
動作確認していません(念のため)。
------------------------------------------
予め上限サイズがわかっているなら、それより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;
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);
とすれば上手くいくのですが、何となくスマートじゃないような。
どう思われますか?
> 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番目の要素のアドレスになる。
編集元を変更可能ならば挿入分ずらして上書きするとか。
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);
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文字削除
削除もあったのみてなかった。
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等)
皆さん有り難うございます。
memcpyか、stringクラスを使うと良いのですね。
どちらの方法でも上手くいきました。有り難うございます。