質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1301閲覧

C言語 ISBN10の判定方法

Kassy11

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/01/28 12:11

ISBN10から書籍の出版国名と出版社名を判定するプログラムを実装しています。
現段階では、group_codeとbook_codeをユーザに入力してもらい、それをもとにそれぞれの関数(getcountryname/getpublishname)から出版国名と出版社名を判定しようとしています。

以下のコードを入力値を
2 07 1234567
とすると、
国名:China,出版社名:サポートされていません
と出力され、なぜかbook_codeから出版社国名が判定されてしまいます。

group_codeから出版社国名が判定できるようにするにはどうすればよいでしょうか。

#include <stdio.h>
#include <stdlib.h>

typedef struct{
int group_code[1];
int book_code[2];
char other_code[7];
}isbn10;

typedef struct{
int country_code;
char *country_name;
}country_info;

typedef struct{
int company_code;
char *company_name;
}publish_info;

char *getcountryname(isbn10 x);
char *getpublishname(isbn10 y);

int main(void) {
isbn10 mybook;
printf("調べたいISBN10を入力してください。ただしグループ記号(1桁)と出版社記号(2桁)、その他の記号(7桁)の間にはスペース必須。\n");
fflush(stdout);
if(scanf("%d %d %s",mybook.group_code,mybook.book_code,mybook.other_code)!=3){
printf("サポートされていません。\n");
return -1;
}

printf("国名:%s,出版社名:%s",getcountryname(mybook),getpublishname(mybook)); return 0;

}

char *getcountryname(isbn10 x){
static country_info countries[]={
{0,"English"},
{1,"English"},
{2,"French"},
{3,"German"},
{4,"Japan"},
{5,"Russia"},
{6,"サポートされていません"},
{7,"China"},
{8,"サポートされていません"},
{9,"サポートされていません"}
};

country_info *ph; for(ph=countries;(*ph).country_code<10;ph++){ if(x.group_code[0]==(*ph).country_code){ return (*ph).country_name; } } return "サポートされていません";

}

char *getpublishname(isbn10 y){
static publish_info publishes[]={
{0,"岩波書店"},
{1,"旺文社"},
{2,"朝日新聞社"},
{3,"偕成社"},
{4,"角川書店"},
{5,"学研"},
{6,"講談社"},
{7,"主婦の友社"},
{8,"集英社"},
{9,"小学館"}
};

publish_info *ps; for(ps = publishes;(*ps).company_code<10;ps++){ if(y.book_code[0]==0&&y.book_code[1]==(*ps).company_code){ return ps->company_name; } } return "サポートされていません";

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

配列の初期化の方法をfor文に変えてみるとうまくいきました。
ありがとうございました。

printf("グループ記号:");
scanf("%d",&mybook.group_code[0]);

printf("出版社記号:"); for(int i=0;i<2;i++){ scanf("%d",&mybook.book_code[i]); } printf("その他の記号:"); for(int m=0;m<7;m++){ scanf("%s",&mybook.other_code[m]); }

投稿2019/01/28 14:02

Kassy11

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

手元でテストしたら、
"国名 : Franch,出版社名 : サポートされていません" ですね。

C

1scanf("%d %d %s",mybook.group_code,mybook.book_code,mybook.other_code)

が問題ですね。 book_code は、int book_code[2]; で定義されているので、 book_code[0] <= 02 で、book_code[1] は不定(何も代入されない)
従って、 "サポートされていません"です。

if(y.book_code[0]==0&&y.book_code[1]==(*ps).company_code){

if(y.book_code[0]==(*ps).company_code){ とするとどうでしょう。

投稿2019/01/28 12:28

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kassy11

2019/01/28 13:03

そのように書き換えましたが、やはり直りません…。 ちなみに、出版社番号は2桁で、1桁目は必ず0となる範囲内でしか考えていないので、元のコードではy.book_code[0]==0としてみています。 調べたい番号を入力してください。ただしグループ記号(1桁)と出版社記号(2桁)、その他の記号(7桁)の間にはスペース必須。 3 07 1234567 国名:China,出版社名:サポートされていません
pepperleaf

2019/01/28 14:08

手元だと、OKだったのですが、何が違ったか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問