2016-10-06 17 views
-4

私はいくつかのデータを記録し、それをファイルに書き込み、ファイルへのパスを文字列として返す関数を持っています。文字列ポインタのネストされた関数に渡す問題

私はその文字列を取得し、ファイルを解析し、ファイルがが解析できる前に、構造

にデータを配置関数に渡す必要があり、文字列のパスは、そう、「変換」する必要があります各ディレクトリ区切り文字にはバックスラッシュのエスケープ文字が含まれています。私はこの文字列を別の関数に渡します。

これは非常に簡単な作業のようですが、元の戻り文字列を他の関数に正しく渡していないと思います。変換後にコンソールの出力をチェックすると、文字。以下は、私がやろうとしていることの簡単な例です。私は変換メソッドが問題ではないことを知っている。なぜなら、ネストされた変換関数内にあるコードの行をmain()に入れると、すべてがスムーズに動作するからです。他の機能を実行してから操作しようとします。

main(){ 
    char* filePath = logData(); 
    parseData(filePath); 
} 

int parseData(char* filePath){ 

    char* transformFile = transFormPath(filePath); 

    //parse data from transformFile 

    return 0; 
} 

char* transFormPath(char* filePath){  

    //transform filePath to newPath 

    return newPath; 

} 

ありがとうございました!

+0

1.関数定義は 'char * transformPath(char * filepath) 'でなければなりません。' parsedata'の場合も同様です。 2. 'parsedata'の最後にreturn文があるはずです。3.次に、' filepath = parsedata(filepath) 'でこの新しいポインタをメインに取り込みます。 –

+0

tranformPathは何をしますか? –

+0

@RishikeshRajeはchar * filePathとchar * filePathの間に本当に違いがありますか? parseDataのreturn文は整数ですが、これは私が持っている問題とは関係がないため、含まれませんでした。助けてくれてありがとう! – skevthedev

答えて

1

メモリ管理のため、文字列操作では便利なインターフェイスを使用できません。関数が文字列を受け取り、それを別の文字列に変換する場合は、そのインタフェースを宣言する方法を決定する必要があります。

最も簡単なインターフェイスはインプレースです(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); 
} 

便利なルールは「mallocfreeは、同じ関数内で呼ばれるべき」される - このインタフェースは、それに違反しないことが可能となります。

また、このインターフェイスでは、スタック(自動)メモリ割り当てを使用できます。出力のサイズに制限がある場合は、スタックに最大バッファを割り当ててください。

+0

ありがとう、これは私が必要としたものです。私はあなたがこれを説明する時間を感謝しています。 – skevthedev

関連する問題