掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.30072

空白を含む文字列の入力
投稿者---矢島(2007/04/26 19:57:36)


環境はWindowsXP、gccを使っています。
番号、名前、氏名のメンバを持つ構造体を宣言し
値を入力していくプログラムの作成をしています。
値の入力の際、氏名は空白を含む入力もできるようにしたいのですか
getsを使うとコンパイル時にエラーが出てしまいます。
下記のプログラムの場合どのように変更すればいいのでしょうか?
よろしくお願いします。

#include <stdio.h>
#define MEMBER_NUM 2

typedef struct group_member{
    int no;
    char name[21];
    char blood[3];
}group_member;

void group_member_input(group_member *member)
{
    printf("No > ");
    scanf("%d", &member->no);
    printf("NAME > ");
    scanf("%s", member->name);
    printf("Blood Type > ");
    scanf("%s", member->blood);
}

void group_member_print(group_member *member)
{
    printf("No  NAME  Blood Type\n");
    printf("%d  ", member->no);
    printf("%s  ", member->name);
    printf("%s\n", member->blood);
}

int main(void){
    group_member member[MEMBER_NUM];
    int i;
    for(i=0;i<MEMBER_NUM;i++) group_member_input(&member[i]);
    for(i=0;i<MEMBER_NUM;i++) group_member_print(&member[i]);
    return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:空白を含む文字列の入力 30073 επιστημη 2007/04/26 21:32:01


No.30073

Re:空白を含む文字列の入力
投稿者---επιστημη(2007/04/26 21:32:01)
http://blogs.wankuma.com/episteme/


>getsを使うとコンパイル時にエラーが出てしまいます。

どんなコードを書いて/どんなエラーが出ましたか?
マニュアル読みましたか?



この投稿にコメントする

削除パスワード

No.30074

Re:空白を含む文字列の入力
投稿者---矢島(2007/04/26 21:44:04)


>>getsを使うとコンパイル時にエラーが出てしまいます。
>
>どんなコードを書いて/どんなエラーが出ましたか?
>マニュアル読みましたか?

scanf("%s", member->name);の部分をgets(member->name)に変えて
コンパイルを行いましたがgets is dangerous and should not be usedと
エラーが出ましたのでgets以外の方法を探しています。


この投稿にコメントする

削除パスワード

No.30075

Re:空白を含む文字列の入力
投稿者---yoh2(2007/04/26 21:54:25)


>scanf("%s", member->name);の部分をgets(member->name)に変えて
>コンパイルを行いましたがgets is dangerous and should not be usedと
>エラーが出ましたのでgets以外の方法を探しています。

それ、多分エラーじゃなくて警告。
警告もエラーとして扱う設定にしているのかもしれませんが。

それは置いといて、getsが嫌われるのは、最大文字数の制限ができず、
バッファオーバーフローの原因になるから。
この辺に関しては、実はscanf("%s", buf)も同じ問題を抱えていたりします。
getsの代替案はfgets。こっちはバッファサイズ(member->nameのサイズ)の指定が
できるので安全です。


この投稿にコメントする

削除パスワード

No.30077

Re:空白を含む文字列の入力
投稿者---矢島(2007/04/26 22:05:36)


>getsの代替案はfgets。こっちはバッファサイズ(member->nameのサイズ)の指定が
>できるので安全です。

ありがとうございます。
scanf("%s", member->name)をfgetsにかえ、コンパイルし、動かして
みたのですが、今度は一人目の入力の際はうまく動くのですが、
二人目の氏名の入力の所で入力が飛ばされ血液型の入力になってしまいます。
たびたび申し訳ないのですがこのような場合はどうすればいいのでしょうか?


この投稿にコメントする

削除パスワード

No.30078

Re:空白を含む文字列の入力
投稿者---ぽへぇ(2007/04/27 06:06:29)


おそらくこれが原因ではないでしょうか。

http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4

そちらの環境では二人目の氏名の入力の所、とありますが、
こちら(VC++ 2005)では一人目の氏名の入力の時点で
血液型の入力になります。



この投稿にコメントする

削除パスワード

No.30076

Re:空白を含む文字列の入力
投稿者---bugs(2007/04/26 21:59:37)


>コンパイルを行いましたがgets is dangerous and should not be usedと

なるほど。gccは「gets()は使っちゃいかん」と言ってくれるのですね。
bccあたりに比べると親切ですね。

本題の、空白を含む文字列の入力は、fgets()あたりを使うと
よいのではないでしょうか。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧