0

私は 3 つの関数を書き込もうとしています: 最初の関数: "read_comp" は char ポインターを初期化し、"readAndRemove" が返す関数を割り当てます。readAndRemove 読み取り行をユーザーから削除し、文字列の前にあるスペースをすべて削除し、先頭にスペースがない文字列へのポインターを返します。次に、「read_comp」は、「readAndRemove」によって取得された文字列を出力します-スペースのないもの。

最後の関数 - 私が問題を抱えている関数... 関数 "findComplex": この関数を実行しようとしているのは、char ポインターを取得し、関数が取得した文字列を出力することだけです。

void read_comp(void)
{
    char *str = readAndRemove();
    printf("%s\n",str);
    findComplex(&str);
}

-------------

char * readAndRemove() /**function to read rest of input and remove first space**/
{
    char tempChar[30];
    fgets(tempChar,30,stdin);
    char* ptr = strtok(tempChar, " ");
    return ptr;
}

--------------
void findComplex(char* str)
{
    printf("in findComplex:%s\n",str);

}

(最初が無関係だったら申し訳ありませんが、私はすべてをやっている方法に問題があるかもしれないと思っていました...)

だから私はいくつかのことを修正して変更しようとしました: これを変更: define char *str; グローバルパラメータとして、関数を変更します:

void read_comp(void)
{
    *str = readAndRemove();
    printf("%s\n",str);
    findComplex(str);
}

char * readAndRemove() /**function to read rest of input and remove first space**/
{
    char tempChar[30];
    fgets(tempChar,30,stdin);
    char* ptr = strtok(tempChar, " ");
    return ptr;
}


void findComplex(char* str)
{
    printf("%s\n",str);
    printf("in findComplex:%s\n",str);

}
4

2 に答える 2

0

コンパイラで警告を有効にすると (そして、「これを実行してください!」のように言っています)、「ローカル変数へのポインタを返しています」というような警告が表示されます。

char * readAndRemove() /**function to read rest of input and remove first space**/
{
    char tempChar[30];
    fgets(tempChar,30,stdin);
    char* ptr = strtok(tempChar, " ");
    return ptr;
}

ローカル変数へのポインターを返してはいけません。これは、この関数から戻ったときに tempchar (ptr が指す) によって使用されるスペースが次の関数によって再利用されるためです。このメモリに文字列。

私が提案する解決策は、tempchar をread_comp()[1] まで移動し、文字列を に渡すことreadAndRemoveです。

[1] 「キャメルケース」または「_」のどちらの名前を使用するかを決定してください。関数はread_and_removeandread_compまたはreadAndRemoveand である必要がありますreadComp。両方の関数で同じスタイルを見つけると思っていたので、ほとんど間違って書きました。この種のことは、後で何かを変更しようとしたときに気が狂う可能性があります。

于 2012-12-25T13:03:48.017 に答える
0

str関数内の変数read_compは既にポインターです。address-of 演算子&を使用すると、それがポインターへのポインターになります (つまり、 type char **)。関数を呼び出す前に関数がプロトタイプ化されていることを確認しfindComplex、アドレス演算子を使用しないでください。

ただし、より大きな問題があります。それは、readAndRemove関数がローカル変数へのポインターを返すことです。ローカル変数はスタックに格納され、関数がそのスタック領域を返すと、他の関数呼び出しで再利用するために再利用されることに注意してください。代わりに関数で配列を作成し、read_compそのサイズと共に関数に渡しreadAndRemoveます。

于 2012-12-25T09:55:55.300 に答える