こんにちは<_ _>
文字列の照合に関する質問です。
データを探索するプログラムを作っていましたが
既存データと入力データの照合ができません。
#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;までは変えてはいけないと問題にあります。)
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
回答ありがとうございました<_ _>
>girlのnameと比較なのかageと比較なのかわかりません。
strcmp(a[i].name,key)で通りました。
ありがとうございます。
まだ構造体やレコードに対する勉強が足りないようです・・・
No.5
- 回答日時:
> あと。
学校の問題なのでしょうが、scanfを用いるのは非常によろしくないです。何がよろしくないのか不明。
ただし、"%s"がまずいのは同意します。書式指定は、"%19s%*[^\n]%*c"とするのが吉。
それより、学校の課題でstrcasecmpやstrncasecmpのような非標準関数を使うことの方が問題です。
No.4
- 回答日時:
がると申します。
ちょいとばかり蛇足ではありますが。
文字比較は、strcmp(文字列が'\0'で止まってない可能性があるときは危険)以外ですと
memcmp:lengthを指定するので、ちゃんと指定すれば比較的安全
strncmp:同じくlength指定も出来る
があります。また、ちょっとイレギュラなところでは
strcasecmp、strncasecmp:大文字と小文字を一緒くたに扱う
なんてぇのもあります。
あと。学校の問題なのでしょうが、scanfを用いるのは非常によろしくないです。
可能ならfgetsを使うように修正されることをお勧めいたします。
早速の回答感謝の極みです<_ _>
照合にstrcmpを使用してみましたがうまくいきません
strcmp(a[i],key)
でコンパイルしたましたが
incompatible type for argument 1 of `strcmp'
と出てしまいました。
このstrcmpの使い方をサイトで見ましたが単純な文字列の照合なら
わかりますが、ソートやレコードとなるとどういう風に使っていいのか
まったくルールみたいなものがわかりません・・・
エラーばかりでとても使いづらいです><、
No.3
- 回答日時:
> また、scanfの使い方ですが、
> keyに入力された文字列に'\n'が付いているかどうかを
> チェックする必要があります。
このチェックは不要です。keyを入力する際、
Ann<Enter>
と入力した場合、key[]には
'A', 'n', 'n', '\0'
の4バイトが入ります。'\n'は入りません。
文字列の末尾に'\n'が付いているかどうかをチェックする必要があるのは、
fgets()を使ったときです。
No.2
- 回答日時:
文字列の比較にはstrcmpのシリーズを使います。
が、その前に構造体の理解が足りないようです。比較は構造体のメンバnameと入力した文字列(key)をstrcmpで比較します。
関数の戻り値はマニュアルをよく読んでください。
また、scanfの使い方ですが、
keyに入力された文字列に'\n'が付いているかどうかを
チェックする必要があります。
更に、検索結果をprintfで表示していますが、一致した、しないを
判定する箇所が必要なのでは?
それと、引数にも問題があります。構造体をしっかり理解してください。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sscanfとscanfの違いがよくわか...
-
CStringのFindで文字列検索を行...
-
fgets関数を使用したときの文字...
-
C言語 空白の行(改行のみ)が...
-
charと%c , %s の関係について
-
C言語の勉強しています。すみま...
-
作ったプログラミングC何だけど...
-
strstrを利用しない文字列検索...
-
C言語、単語ごとに改行したい
-
C言語のステップ数をカウントす...
-
C言語でプログラミング。(文...
-
文字列を特定の全角文字で区切...
-
文字列中に含まれる文字の個数...
-
c言語
-
データ数値を16進文字列でprint...
-
小文字のみを数える方法
-
[Java]文字列分割
-
2進数から10進数へ変換プログラム
-
fgetsで拾われる改行文字を削除...
-
反転した数値を表示させるやり方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
C言語のステップ数をカウントす...
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
ある文字列で2回目3回目に出現...
-
itoaわかりません
-
fgets関数を使用したときの文字...
-
fgetsで拾われる改行文字を削除...
-
C言語で16進数文字列から16進数...
-
CStringについて
-
文字列中に含まれる文字の個数...
-
strstrを利用しない文字列検索...
-
文の意味
-
エディットボックスに入力され...
-
文字列の途中に「0」がある場...
-
C++
-
putsとputcharの違い?
-
教えていただけませんか?C言語...
おすすめ情報