• ベストアンサー

文字列の照合についての質問(C言語)

こんにちは<_ _> 文字列の照合に関する質問です。 データを探索するプログラムを作っていましたが 既存データと入力データの照合ができません。 #include<stdio.h> #include<string.h> #define N 10 int main(void) { static struct girl{ char *name; int age; }a[]={"Ann",18,"Rolla",19,"Nancy",16,"Eruza",17,"Juliet",18, "Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18}; char key[20]; int i; printf("検索するdata ? : "); scanf("%s",key); for(i=0;i<N;i++){ ここの部分です if(a[i]==key){ break; } } printf("%s %d",a[i],a[i]); return 0; } 照合するにはどうしたらいいのでしょうか? (#include<stdio.h> から  int i;までは変えてはいけないと問題にあります。)

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.6

今回は検索する文字列の文字数(長さ)が不定なので、 strcmpの方が簡単で良いと思います。 strncmpとかmemcmpとかは余裕があれば、 使ってみるといいと思います。 使い方は参考URL参照。 本題 a[i]と言うのはまだ、いわばまだ構造体の状態です。 これではgirlのnameと比較なのかageと比較なのかわかりません。 ANo.4>学校の問題なのでしょうが、scanfを用いるのは非常によろしくないです。 あえて聞きますが、何故?

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strcmp.html
hisetu_001
質問者

お礼

回答ありがとうございました<_ _> >girlのnameと比較なのかageと比較なのかわかりません。 strcmp(a[i].name,key)で通りました。 ありがとうございます。 まだ構造体やレコードに対する勉強が足りないようです・・・

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

> あと。学校の問題なのでしょうが、scanfを用いるのは非常によろしくないです。 何がよろしくないのか不明。 ただし、"%s"がまずいのは同意します。書式指定は、"%19s%*[^\n]%*c"とするのが吉。 それより、学校の課題でstrcasecmpやstrncasecmpのような非標準関数を使うことの方が問題です。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.4

がると申します。 ちょいとばかり蛇足ではありますが。 文字比較は、strcmp(文字列が'\0'で止まってない可能性があるときは危険)以外ですと memcmp:lengthを指定するので、ちゃんと指定すれば比較的安全 strncmp:同じくlength指定も出来る があります。また、ちょっとイレギュラなところでは strcasecmp、strncasecmp:大文字と小文字を一緒くたに扱う なんてぇのもあります。 あと。学校の問題なのでしょうが、scanfを用いるのは非常によろしくないです。 可能ならfgetsを使うように修正されることをお勧めいたします。

hisetu_001
質問者

お礼

早速の回答感謝の極みです<_ _> 照合にstrcmpを使用してみましたがうまくいきません strcmp(a[i],key) でコンパイルしたましたが incompatible type for argument 1 of `strcmp' と出てしまいました。 このstrcmpの使い方をサイトで見ましたが単純な文字列の照合なら わかりますが、ソートやレコードとなるとどういう風に使っていいのか まったくルールみたいなものがわかりません・・・ エラーばかりでとても使いづらいです><、

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

> また、scanfの使い方ですが、 > keyに入力された文字列に'\n'が付いているかどうかを > チェックする必要があります。 このチェックは不要です。keyを入力する際、 Ann<Enter> と入力した場合、key[]には 'A', 'n', 'n', '\0' の4バイトが入ります。'\n'は入りません。 文字列の末尾に'\n'が付いているかどうかをチェックする必要があるのは、 fgets()を使ったときです。

  • DT200
  • ベストアンサー率38% (63/164)
回答No.2

文字列の比較にはstrcmpのシリーズを使います。が、その前に構造体の理解が足りないようです。 比較は構造体のメンバnameと入力した文字列(key)をstrcmpで比較します。 関数の戻り値はマニュアルをよく読んでください。 また、scanfの使い方ですが、 keyに入力された文字列に'\n'が付いているかどうかを チェックする必要があります。 更に、検索結果をprintfで表示していますが、一致した、しないを 判定する箇所が必要なのでは? それと、引数にも問題があります。構造体をしっかり理解してください。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

ヒントだけ > }a[]={"Ann",18,"Rolla",19,"Nancy",16,"Eruza",17,"Juliet",18, > "Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18}; 書き換えてはいけないといわれている上記の部分を、 }a[]={ {"Ann",18},{"Rolla",19},{"Nancy",16},{"Eruza",17},{"Juliet",18}, {"Machilda",20},{"Emy",15},{"Candy",16},{"Ema",17},{"Mari",18} }; のように、いったん直してから考えると分かりやすいと思います。

関連するQ&A