0

file.txt各行を読んでいる場所があり、それらの行を処理したくありません。このファイルには、IP、ニックネーム、およびいくつかの値が含まれています。IP アドレスだけを別のファイルに保存したいのですが、その前に関数 ( char* get_ip(char arr[])) によって返された結果を確認しています。
問題は戻り値です。たとえば、部分的なものしか表示されません。

通常の IP アドレス: 66.55.44.33
My return:66.55.44

編集:

次の 2 つの機能がありますmain()get_ip()

//<----------- FUNCTION get_ip() -------------------- ><br />

    char* get_ip(char buff[]){

    char line[32];

    for(int i = 0; i < sizeof(buff); i++){
        if(buff[i] == '.'){
            if(isdigit(buff[i + 1])){
                i = 0;
                while(buff[i] != ' '){
                    line[i] = buff[i];
                    i++;
                }
                break;
            }
        }
    }

    if(isdigit(line[0]))
        return line;
    else
        return 0;
}

//<------------ FUNCTION int main() --------------------->


    int main(){
    // variable, opening folder etc.

    char buff[64], *line;

    while(!feof(fph)){
        fgets(buff, 63, fph);
        line = get_ip(buff);

        if(line)
            cout << line << "\n";
    }

    } // main() func. end
4

3 に答える 3

3

ローカル変数と同様に、現在予想される動作は定義されlineていません。関数から戻ることはできません。バッファとは別にしたい場合buffは、宣言の代わりにmallocを使用する必要がありますchar line[32];

于 2012-05-09T13:06:33.667 に答える
2

より多くのコードを表示する必要があります。少なくとも、あなたの署名は機能します。

スタックに割り当てbuffてから、それを返します。

ただし、配列はnever値によって返され、最初の要素へのポインターに減衰されます。つまり、次のように関数を使用すると、次のようになります。

char[32] myFunction(...);

char ip[32] = myFunction(...);

配列は、戻り時にスコープ外になった後に破棄されたip配列()へのポインタで初期化されます。linemyFunction

つまり、ガベージが含まれていて、それから部分的な結果が得られるのは幸運です(ただし、完全なガベージの場合は、問題を簡単に追跡できます)。

考えられる解決策は、std::string(私がお勧めする)を使用するか、事前に割り当てられた配列へのポインターをmyFunction(Cスタイルのソリューション)に渡すことです。

char[32] ip;

myFunction(ip, ...);
于 2012-05-09T13:10:01.363 に答える
2

1 つの問題が次の行にある可能性があります。

for(int i = 0; i < sizeof(buff); i++){

具体的には声明

sizeof(buff)

これはバッファーのサイズである 64 を返すと予想していたかもしれませんが、C 配列がほとんど常にポインターに減衰する方法を忘れているため、実際には 4 (32 ビットの場合) または 8 (64 ビットの場合) を返します。のサイズchar *

サイズを明示的に渡す必要があります。

于 2012-05-09T13:09:58.173 に答える