メモリ管理のため、文字列操作では便利なインターフェイスを使用できません。関数が文字列を受け取り、それを別の文字列に変換する場合は、そのインタフェースを宣言する方法を決定する必要があります。
最も簡単なインターフェイスはインプレースです(strtok
が使用します)。あなたは、出力が入力よりも何とか小さい場合にのみ、それを使用することができます。
void func(char* input_and_output);
より伝統的なインターフェースは、(sprintf
がそれを使用しています)、「事前に割り当てられたバッファに出力」です。あなたは計算したり、何らかの形で出力の大きさを制限することができます場合にのみ、それを使用することができます。
void func(const char* input, char* output);
もう一つのアイデアは、(asprintf
がそれを使用しています)「動的出力を割り当てる」です。それには限界があるが、使用するのがより困難であるされていません。
char* func(const char* input);
その欠点は、それは、発信者に課すことの責任である - それは、将来のある時点で割り当てられた文字列をfree
必要があります。
のは、第3のインタフェースを使用してみましょう:
char* transFormPath(const char* filePath)
{
char* newPath;
newPath = malloc(100); // is 100 enough? no idea
strcpy(newPath, "haha"); // just an example
return newPath;
}
int main()
{
...
char* filePath = "path";
char* newPath = transFormPath(filePath);
...
free(newPath);
}
あなたはこのインタフェースを使用することを決定した場合は、お使いのtransFormPath
機能が動的に文字列を割り当てる必要があり、呼び出し元がいくつかの文字列を解放する必要がありそれがもはや必要でない時。これは実現するのは簡単ではありません。通常、「文字列が必要でない時間」は定義が容易ではなく、コードを変更すると、free
を呼び出すのが安全です。すばやく汚れたハックとして、メモリを解放せずに(つまり、意図的にメモリリークを引き起こすことなく)コードを書くことができます。
のは、第2のインタフェースを使用してみましょう:親指の
void transFormPath(const char* filePath, char* newPath)
{
// Here we assume newPath has enough space to hold the output
strcpy(newPath, "haha"); // just an example
}
int main()
{
...
char* filePath = "path";
char* newPath = malloc(100); // is 100 enough? no idea
transFormPath(filePath, newPath);
...
free(newPath);
...
char newPath2[100]; // is 100 enough? no idea
transFormPath(filePath, newPath2);
}
便利なルールは「malloc
とfree
は、同じ関数内で呼ばれるべき」される - このインタフェースは、それに違反しないことが可能となります。
また、このインターフェイスでは、スタック(自動)メモリ割り当てを使用できます。出力のサイズに制限がある場合は、スタックに最大バッファを割り当ててください。
1.関数定義は 'char * transformPath(char * filepath) 'でなければなりません。' parsedata'の場合も同様です。 2. 'parsedata'の最後にreturn文があるはずです。3.次に、' filepath = parsedata(filepath) 'でこの新しいポインタをメインに取り込みます。 –
tranformPathは何をしますか? –
@RishikeshRajeはchar * filePathとchar * filePathの間に本当に違いがありますか? parseDataのreturn文は整数ですが、これは私が持っている問題とは関係がないため、含まれませんでした。助けてくれてありがとう! – skevthedev