2016-10-20 25 views
0

私はC言語ではまったく新しく、2つの別個の構造体メンバ変数から文字列を比較する方法が不思議でした。多分私のコードを提供することは、私が求めていることを明確にするでしょう。C:構造体からの2つの文字列を比較する

私は、次の構造を有する:

typedef struct mentry { 
    char *surname; 
    int house_number; 
    char *postcode; 
    char *full_address; 
} MEntry; 

は、私は2つの別々のMEntry内の変数を比較したいです。私は両方のエントリの姓が同じかどうか確認したい。だから、私は次のメソッドを書いている:

int me_compare(MEntry *me1, MEntry *me2) 
{ 

    int surnameResult; 


    char me1Surname = *(me1->surname); 
    char me2Surname = *(me2->surname); 

    surnameResult = strcmp(me1Surname, me2Surname); 
    return surnameResult; 
} 

私は私のプログラムをコンパイルするとき、私は次のメッセージを得る:

char me1Surname = *(me1->surname); 

mentry.c:30:6: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [enabled by default] 
    surnameResult = strcmp(me1Surname, me2Surname); 

は、その行を思考で私が間違っています

はme1Surnameを姓のアドレスではなく姓の値に設定しますか?

私はまた、別の警告が言ってます:この警告が表示された理由を

"In file included from mentry.c:2:0: 
/usr/include/string.h:140:12:note: expected ‘const char *’ but argument is of type ‘char’ 
extern int strcmp (const char *__s1, const char *__s2)" 

誰かが説明できますか?

+0

変数 'me1Surname'と 'me2Surname'は*単一文字*です。実際の構造体メンバで 'strcmp'を呼び出してください。 –

+0

お返事ありがとうございます。 'surnameResult = strcmp(*(me1-> surname)、*(me2-> surname)); ' – cgy95

+0

逆参照演算子を使用しないでください。これは、ポインタが指している値を取得します。ポインターは単一の文字を指しているので、ポインターの逆参照によって1つの文字が得られます。 'strcmp'の呼び出しでアスタリスクを削除してください。 –

答えて

3

あなたはあまりにもハードしようとしている:

は明白な方法を試してみてください。

int me_compare(const MEntry *me1, const MEntry *me2) 
{ 
    return strcmp(me1->surname, me2->surname); 
} 
+0

@メルポメンが正しいと判断されました。 –

+0

ありがとう、私はそれが動作すると思います。私は、両方の値が同じかどうかをその行がどのように伝えることができるのかと疑問に思いましたか? – cgy95

+0

@ cgy95これは['strcmp'](https://linux.die.net/man/3/strcmp)の動作方法です。 ['strcmp' documentation](https://linux.die.net/man/3/strcmp)のどの部分を理解できませんでしたか? –

0

あなたはこの単純な例を試すことができます。代わりに2つの構造体オブジェクトをテストし、構造体内のポインタの姓を比較する必要があります。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
    char *surname; 
    int house_number; 
    char *postcode; 
    char *full_address; 
} MEntry; 

int me_compare(MEntry *me1, MEntry *me2); 

int 
main(void) { 
    MEntry me1 = {"McLeod", 27, "3432", "27 Baker Street, London"}; 
    MEntry me2 = {"Baggins", 19, "3242", "145 Bag End, Shire"}; 

    if (me_compare(&me1, &me2) == 0) { 
     printf("Surnames are identical.\n"); 
    } else { 
     printf("Surnames are different.\n"); 
    } 

    return 0; 
} 

int 
me_compare(MEntry *me1, MEntry *me2) { 
    int surnameResult; 

    surnameResult = strcmp(me1->surname, me2->surname); 

    return surnameResult; 
} 
+0

ありがとうございます。それは素晴らしいです。私はそれをテストすることができます。 – cgy95

+0

新しいMEntryを作成するためにファイルからデータが解析されています – cgy95

+0

Meldrew、Victor 1 Happenstance Place、London N11 3SR 私たちは完全なアドレス行を取り、それを解析してMEntry構造体にします。私が作成したMEntryは動的ハッシュテーブルに入れます。 – cgy95

1

文字列ライブラリを使用せずに文字列を比較します。 このメソッドは、両方の文字列が等しい場合、同じ値が0を返す場合は文字列を比較します。メソッド内部の構造体ポインタを渡します。

int compareStr(char *s, char *t) 
{ 

    char t1 = *s; 
    char t2 = *t; 
    int x; 

    while (t1 != '\0' && t2 != '\0') { 
     x = (int)(t1 - t2); 
     if (x ==0) { 
      s++; 
      t++; 
      t1 = *s; 
      t2 = *t; 
     } 
     else 
     { 
      break; 
     } 
    } 


    return x; 

}