2016-05-09 8 views
0

私は次のコードを持っている:私は間違った値を取得し、私は前の質問で読むこの問題が発生したstrlen(realtor_command[0])を使用する場合はstrlenは配列へのポインタで正しい値を返しません

char* realtor_command[120]; 
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){ 
    realtor_command[i]=malloc(sizeof(120)); 
} 
realtor_command[0]="test_string" 
realtor_command[1]="next_test_string" 

をその理由は、アレイとポインタではありませんが、この問題の修正は見つかりませんでした。

私の質問は、とにかくrealtor_command[i]の長さを取得するにはどうすればいいですか?

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

EDIT:

これは私がSTRLEN呼び出す方法である:このコードで

char* matrix=malloc(strlen(realtor_command[8])+1); 
+2

が一緒に、あなたは 'strlen'を呼び出す方法をしてください表示間違った値で – Downvoter

+8

「sizeof(120)」は何ですか?あなたは120バイトよりもずっと少ないメモリを割り当てています。 – ForceBru

+2

これはsizeof(int)(4または8)です。 –

答えて

3

char* realtor_command[120]; 
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){ 
    realtor_command[i]=malloc(sizeof(120)); 
} 

あなたは120個の文字列の配列を作成し、次いでREALTOR_MAX_COMMANDストリングをループ(おそらくこれは120でなければなりませんか?)、新たに割り当てられた4バイトまたは8バイトの文字列(sizeof(120)sizeof(int)を意味し、4バイトまたは8バイトのいずれかです)に設定します。これらの文字列は新たに割り当てられるため、任意のデータが含まれ、ヌルターミネータで終了することはできません。

strlen()は、ヌルターミネータが見つかるまで文字列をループするだけなので、ヌルターミネータ以外の文字列は使用できないため、これは重要です。

あなた自身でヌルターミネータを追加することはできますが、文字列には文字列の末尾まで任意のガーベッジが含まれ、ヌルターミネータが内部に含まれる可能性があります。あなたは彼らがNULL終止符を開始させることができたが、その後strlen()は常に良いかもしれない何

0は、あなたが実際にそれらを埋める際にこれらの文字列を割り当てることで戻ってくる、それまでにnullポインタを置いておく:

char* realtor_command[120]; 
for (int i = 0; i < 120; i++) { 
    realtor_command[i] = NULL; 
} 

char input_buffer[REALTOR_MAX_COMMAND]; 

// Read in one string, then copy it so we can re-use the buffer 
fgets(input_buffer, REALTOR_MAX_COMMAND, stdin); 
realtor_command[0] = strdup(input_buffer); 

これにより、コード内のメモリリークも回避されます。あなたはおそらく、あなたのバッファに必ず入力フィットを作るために、fgetsで読み取り、文字列が改行が含まれていることを確認したいと思うことを

注:

if (strstr(input_buffer, "\n") == NULL) { 
    // error, input didn't fit in our buffer! 
} 
関連する問題