アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは<_ _>
文字列の照合に関する質問です。
データを探索するプログラムを作っていましたが
既存データと入力データの照合ができません。

#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;までは変えてはいけないと問題にあります。)

A 回答 (6件)

今回は検索する文字列の文字数(長さ)が不定なので、


strcmpの方が簡単で良いと思います。
strncmpとかmemcmpとかは余裕があれば、
使ってみるといいと思います。
使い方は参考URL参照。

本題
a[i]と言うのはまだ、いわばまだ構造体の状態です。
これではgirlのnameと比較なのかageと比較なのかわかりません。

ANo.4>学校の問題なのでしょうが、scanfを用いるのは非常によろしくないです。
あえて聞きますが、何故?

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strcmp.html
    • good
    • 0
この回答へのお礼

回答ありがとうございました<_ _>
>girlのnameと比較なのかageと比較なのかわかりません。
strcmp(a[i].name,key)で通りました。
ありがとうございます。

まだ構造体やレコードに対する勉強が足りないようです・・・

お礼日時:2007/05/28 12:12

> あと。

学校の問題なのでしょうが、scanfを用いるのは非常によろしくないです。

何がよろしくないのか不明。
ただし、"%s"がまずいのは同意します。書式指定は、"%19s%*[^\n]%*c"とするのが吉。

それより、学校の課題でstrcasecmpやstrncasecmpのような非標準関数を使うことの方が問題です。
    • good
    • 0

がると申します。


ちょいとばかり蛇足ではありますが。

文字比較は、strcmp(文字列が'\0'で止まってない可能性があるときは危険)以外ですと
memcmp:lengthを指定するので、ちゃんと指定すれば比較的安全
strncmp:同じくlength指定も出来る
があります。また、ちょっとイレギュラなところでは
strcasecmp、strncasecmp:大文字と小文字を一緒くたに扱う
なんてぇのもあります。

あと。学校の問題なのでしょうが、scanfを用いるのは非常によろしくないです。
可能ならfgetsを使うように修正されることをお勧めいたします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/28 10:49

> また、scanfの使い方ですが、


> keyに入力された文字列に'\n'が付いているかどうかを
> チェックする必要があります。

このチェックは不要です。keyを入力する際、
Ann<Enter>
と入力した場合、key[]には
'A', 'n', 'n', '\0'
の4バイトが入ります。'\n'は入りません。

文字列の末尾に'\n'が付いているかどうかをチェックする必要があるのは、
fgets()を使ったときです。
    • good
    • 0

文字列の比較にはstrcmpのシリーズを使います。

が、その前に構造体の理解が足りないようです。

比較は構造体のメンバnameと入力した文字列(key)をstrcmpで比較します。
関数の戻り値はマニュアルをよく読んでください。
また、scanfの使い方ですが、
keyに入力された文字列に'\n'が付いているかどうかを
チェックする必要があります。

更に、検索結果をprintfで表示していますが、一致した、しないを
判定する箇所が必要なのでは?
それと、引数にも問題があります。構造体をしっかり理解してください。
    • good
    • 0

ヒントだけ



> }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} };

のように、いったん直してから考えると分かりやすいと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!