学校の課題で、
---
探索キーとして名前を入力し、入力と一致した場合、その名前と年齢を印字することを繰り返す。
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;
}
No.2ベストアンサー
- 回答日時:
★回答
間違い:
・『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 );
}
・最後に、頑張っていますね。応援していますよ。
No.1
- 回答日時:
サンプルです。
#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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- 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# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
講義でわからないのですが以下...
-
VBA他のブックから値のみ貼付す...
-
C言語について
-
FindFirst を複数条件で検索
-
VBAでPDFのコピーとリネームを...
-
C言語 家系図
-
「*:*」って何を意味するのでし...
-
[python] 文字列を変数名として...
-
ACCESS テキストボックスを隙...
-
実行時エラー 3020の対策
-
Objective-Cでのエラー
-
vbaでxmlからNodeListでデータ...
-
構造体の各データの表示につい...
-
セグメンテーション違反
-
JSONで文字列が長い時
-
子windowsからsubmit()後にclos...
-
formで特定のinputを送信しない...
-
c言語 16進数の2進数への変換
-
メモリをアドレスを直接指定し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Application.ScreenUpdating = ...
-
実行時エラー 3020の対策
-
FindFirst を複数条件で検索
-
「*:*」って何を意味するのでし...
-
ACCESS テキストボックスを隙...
-
パイソンプログラミング
-
VBAでPDFのコピーとリネームを...
-
パイソンのクラスのブログラム
-
【メモリ不足で落ちる(python)】
-
[python] 文字列を変数名として...
-
パイソンのクラスについて
-
vscode 文字化け
-
PythonのExperimentに関する質...
-
vbaでxmlからNodeListでデータ...
-
phpでボタンを押したときに変数...
-
UWSC:ポップアップウインドウ...
-
VBA他のブックから値のみ貼付す...
-
構造体の各データの表示につい...
-
コンボボックスのtag情報の取得...
-
VBAで特殊文字を出力したい
おすすめ情報