私の機能では、部分文字列を置き換えます。入力部分文字列が元の部分文字列よりも長い場合は、入力文字列の一部を移動して入力部分文字列のためのスペースを確保します。realloc()を使用してmemmove()を安全にする
この結果、未定義の動作が発生することがわかりました。私はrealloc()を使って必要なスペースを割り当てることができるはずだが成功していないと思った。
I)は、(MEMMOVE前にこれを追加してみました:
char *newspc = (char*)realloc(in,len+sublen);
in = newspc;
これは合理的な戦略ですか?この操作のためのスペースを作る正しい方法は何ですか?あなたがのreallocを使用したい場合、あなたはreallocのは、データをコピーするの世話をするために、MEMMOVEを使用する必要はありません、
#include <iostream>
#include <string>
#include <string.h>
void replc(char* in, char* subin);
int main()
{
char stmt[] = "replacing this $string ok";
std::cout << stmt << "\n";
replc(stmt, "longerstring"); //<<<4 characters longer breaks the program
std::cout << stmt << "\n";
}
void replc(char* in, char* subin){
uint8_t len = strlen(in);
uint8_t aftok = strchr(strchr(in, '$'), ' ')-in;
uint8_t dollar = strchr(in, '$')-in;
uint8_t tklen = aftok - dollar;
uint8_t sublen = strlen(subin);
if(sublen <= tklen){
//enough room for substring
memmove(in+aftok-(tklen-sublen), in+aftok, (tklen-sublen)+1);
memcpy(in+dollar, subin, sublen);
in[len-(tklen-sublen)] = '\0';
}
else{
//not enough room for substring
// memory allocation should take place here?
memmove(in+aftok+(sublen-tklen), in+aftok, (sublen-tklen)+1);
memcpy(in+dollar, subin, sublen);
in[len+(sublen-tklen)] = '\0';
}
}
*文字列の外側のインデックスは、割り当てられていないメモリであると考えました。入力部分文字列の長さを数文字だけ増やしても、プログラムは失敗します。* - 未定義の動作、単純で単純です。境界を超えて配列にアクセスすると、「仕事」を含む何かが起こります。 – PaulMcKenzie
私はそのリンクに照らして質問を変えました。 – oraz
これに 'std :: string'を使わないのはなぜですか?私はあなたが最終的にこの問題を解決するための "魔法のコード"を理解しようとしていることを知っています。バッファとポインタを使ってやるだけです。しかし、バグを修正する以外は、あなたはそれから何を得るのですか?あなたの時間を評価するなら 'std :: string'を使ってください。あなたは ''も含めましたが、何も使っていませんでした。 –
PaulMcKenzie