2012-05-09 17 views
0

私はfile.txtを持っています。私は各行を読み込んでいますが、私はこれらの行を処理することはできません。このファイルには、IP、ニックネーム、およびいくつかの値が含まれています。私はIPアドレスだけを別のファイルに保存したいが、その前に私の関数(char * get_ip(char arr []))が返す結果をチェックしている。 問題は、返される値です、それは私に部分的にしか、例えば見せている:C - 返された値は部分的で完全ではありません

通常のIPアドレス:66.55.44.33
を私のリターン:66.55.44

編集:

2つの機能があります。 :main()とget_ip()

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

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; 

}

// < ------------ファンクション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 
+1

は、あなたのタグが正しいですか? –

+7

'cout'?私にはC++コードのように見えますが、C#ではありません。 –

+1

これはC#またはC++ですか? – Tudor

答えて

2

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

スタックにbuffを割り当てて返します。

しかし、配列は値によって返されるneverで、最初の要素へのポインタに減衰します。

char[32] myFunction(...); 

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

あなたip配列はときmyFunction戻っスコープの外に行く後に破壊された配列へのポインタ(line)で初期化されています。あなたはこのようなあなたの機能を使用するときことを、意味 !

つまり、それにはゴミが含まれていて、その部分的な結果が得られることは幸運です(完全なゴミであれば、問題を簡単に追跡できます)。

可能救済は(私がお勧めする)std::stringを使用するか、myFunction(Cスタイルの溶液)に事前に割り当てられた配列へのポインタを渡すことです:

char[32] ip; 

myFunction(ip, ...); 
+0

私は私の質問を編集しました。 –

+0

私の推測は正しかったです - 問題はあなたがローカル変数のアドレスを返すことです。 –

3

lineがローカル変数であるとして、現在の予想される動作は、定義されていない、あなたは、関数から返すことが許されていません。

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

具体的声明

sizeof(buff) 

あなた間:あなたはそれがbuffから別のバッファになりたい場合は、char line[32];

2

問題の一つはラインであるかもしれない代わりに、宣言のmalloc関数を使用する必要がありますこれは、バッファのサイズである64を返すと期待していたかもしれませんが、C配列がほとんど常にポインタに崩壊することを忘れています。したがって、実際には4(32ビットの場合)または8(64ビットの場合) a char *

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

関連する問題