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

学校の課題で、
---

探索キーとして名前を入力し、入力と一致した場合、その名前と年齢を印字することを繰り返す。
CTR-Dが入力されたとき、プログラムを終了する。
また、文字比較の為に関数strcmpを使用する。

---
という課題が出されたのですが、while(scanf("%s", name) != EOF)を入れるとうまくいきません。
自分で途中までやったものは↓のものです。
どこが違うのか教えてください(>_<)


#include<stdio.h>
#include<string.h>
#define N 10

struct card{
char *name;
int age;
};

struct card meibo[N] = {
"Takahashi", 14,
"Kobayashi", 15,
"Hosokawa", 17,
"Sugimoto", 18,
"Sawai", 19,
"Itou", 20,
"Kawai", 22,
"Ishikura", 24,
"Oda", 25,
"Nakamura", 28
};

int main(void){
char *name;
int i;

printf("name? : ");scanf("%s", name);

while (scanf("%s", name) != EOF){
for (i=0; i<N; i++){
if (strcmp(name, meibo[i].name) == 0) break;
}
}

if (i<N){
printf("%s is %d.\n", meibo[i].name, meibo[i].age);}
else{
printf("Not found.\n");}

return 0;
}

A 回答 (3件)

★回答



間違い:
・『scanf("%s", name);』の『name』はポインタを渡すのではなく、文字配列のアドレスを渡しますよ。
・回答者 No.1 さんの『char name[20];』と宣言します。→『char *name;』ではありません。

関数:
・『scanf』の戻り値は読み込んだ(代入された)フィールド数です。
・戻り値が『0』の場合は、代入されなかったことを意味します。
・エラーが発生した場合は『EOF』が戻りますね。

補足:
・『CTR-D』とは、文字コード 0x04 のことですよ。
・大まかな点でソース内容はあっていますが、微妙に違うため注意しましょう。
・最後に、main関数のみですがサンプルを表記しますよ。→データ定義は正しい。

サンプル:

int main( void )
{
 char name[ 256 ]; ←適当なサイズ
 int i;
 
 printf( "name? : "); scanf( "%s", name );
 
 while ( scanf("%s",name) != EOF ){
  for ( i = 0 ; i < N ; i++ ){
   if ( name[0] == 0x04 ){
    return( 0 ); ←『CTR-D』を検出、プログラムを終了部分
   }
   if ( strcmp(name,meibo[i].name) == 0 ){
    break;
   }
  }
 }
 if ( i < N ){
  printf( "%s is %d.\n", meibo[i].name, meibo[i].age );
 }
 else{
  printf( "Not found.\n" );
 }
 return( 0 );
}

・最後に、頑張っていますね。応援していますよ。
    • good
    • 0

ちなみにだけど, 環境 (OS やコンパイラ) は?

    • good
    • 0

サンプルです。



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

#define N (10)

typedef struct {
char name[20];
int age;
} card;

int main(void)
{
card meibo[N] = {
{ "Takahashi", 14 },
{ "Kobayashi", 15 },
{ "Hosokawa", 17 },
{ "Sugimoto", 18 },
{ "Sawai", 19 },
{ "Itou", 20 },
{ "Kawai", 22 },
{ "Ishikura", 24 },
{ "Oda", 25 },
{ "Nakamura", 28 },
};
char name[20];
int n, i;

while (1) {
printf("探索したい名前は:");
n = scanf("%s", name);
if (n == EOF || name[0] == 4) {
break;
}
for (i = 0; i < N; i++) {
if (strcmp(name, meibo[i].name) == 0) {
break;
}
}
if (i < N) {
printf("%s is %d.\n", meibo[i].name, meibo[i].age);
}
else {
printf("Not found.\n");
}
}
return 0;
}
    • good
    • 0
この回答へのお礼

大変遅くなってしまってすみません(>_<)

while(1)

にすると分かりやすいですね!
ありがとうございました!

お礼日時:2007/01/17 20:43

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