2016-03-27 21 views
-2

等しい文字列に対してstrcmpが0を返すのに問題があります。Strcmpが等しい文字列で等しい値を返さない

これは私のコードは、(とにかく関連部分)どのように見えるかです:メインで

struct person{ 
    char name[30]; 
    time_t date; 
    char destination[30]; 
    char phone[30]; 
}; 

私が持っている:

struct person act_person; 
int f = open("persons.txt", O_RDONLY | O_CREAT, S_IRUSR); 
if(f == -1){ 
    //open error 
} 
char city_name[30]; 
scanf(" %[^\n]s", city_name); 
city_name[strcspn(city_name, "\n")] = 0; 
//lseek(f, 0, SEEK_SET); //took it out as user alk suggested 
while(read(f, &act_person, sizeof(act_person))){ 
    act_person.destination[strcspn(act_person.destination, "\n")] = 0; 
    if(strcmp(act_person.destination,city_name)==0){ 
      printf("%s\n",act_person.name); 
    } 
} 
close(f); 

私は同様のバイトにまで書かれていたから読んでいるファイル人の構造体のサイズのチャンクので、それは動作する必要があります...まだ私はstrcmpを行うに関係なく同等に返されません。

編集:

:私はできるだけ早く私が行う方法を見つけ出すよう、ここで

がダンプであるだけであること、利用者が示唆したように、問題を見つけるために、ファイルのhexdumpに対してを表示しようとするつもりです

Hexdump of persons.txt

+2

デバッグする必要があります - 各文字列に含まれるバイト値を確認してください。 –

+4

一般的なコメント:あなたは不満を感じていますが、最後の苦情は質問にあまり寄与しません。彼らはちょうど私に "この人は怒っていると思う。私が助けようとすれば、彼らはただ私に怒っているのだろうか?" –

+0

大文字小文字の問題を取り除くために 'strcmpi'を試してみてください... –

答えて

-1
  1. 構造体のアドレスで読み取る通話は危険です。構造体のレイアウトについては絶対に保証はありません。異なるバイト順序、異なるパディング、異なるサイズ、time_tは実装定義です。あなたは本当にこれを変更する必要があります。

  2. strtokは、調べる文字列を変更します。あなたはそれが欲しいですか?特に "name"という文字列を使用します。これはstrtok呼び出しによって変更されます。

  3. 複雑なif文を実行するのではなく、値を中間変数に格納するため、デバッガを使用して何が起きているかを確認できます。 strtok呼び出しの前と後の値は何ですか?

  4. 解決策の1時間分を検索するのはいらっしゃいません。

(私は答えを入力してから変更されていることに気がつきました)。

  1. ランダムな変更はほとんど役に立ちません。デバッグを介して何が起こるかを調べる。間違っていることを理解する。問題を理解する方法を解説します。その後、問題を解決してください。
+0

私はstrtokを取り出し、代わりに他の人が提案したものを使用しました。値が何であるかを一瞬で見てみるつもりです。 – user1966576

1

これにより、ファイルの最初のレコードがact_personに読み込まれます。ファイルからのデータはあなたを与える:

.name = "Mark" 
.date = 0x56f821fc 
.destination = "\xb5\xd9\xc1\x95\xac\x7f" 
.phone = "361444555" 

あなたは、あなたのdesitinationフィールドに入力を読んでいない驚くほど、彼らは一致しない名前を比較します。次のレコードのdestinationも同様にゴミと思われます。

+0

あなたは目的地が少し間違っていると思う。表示するバイトは、宛先のオフセット8からのものです。 – alk

+0

宛先がレコードオフセットで始まると仮定します。32:最初のレコードの宛先は、 '0xfc 0x21'で始まります。 – alk

+0

Err ok私はちょうど問題の一部を修正しました。現在、strcmpは動作しているようですが、ファイルの最後の "構造体"のsyedバイトのみです。 – user1966576

関連する問題