🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1281閲覧

switch文が正常に作動しません。c言語

kananananana

総合スコア6

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/21 06:15

switch文のcase2の動作が正常に作動しません。printf("Enter a new employee name:");このパートがうまくいってないみたいで下記の出力のような次のprintfに繋がった出力になってしまいます。
case2を独立させて動かしてみたところ問題なく期待通りの出力を得られました。

問題のあるプログラム

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> void search(); void assing(); int main(void) { int ch; while (1) { printf("==================Employee Management System=============\n\n"); printf("1. Search\n\n"); printf("2. assign\n\n"); printf("0. Exit\n\n"); printf("========================================================\n\n"); printf("\nPlease enter your Choice:"); scanf("%d", &ch); switch (ch) { case 1: search(); break; case 2: assing(); break; case 0: exit(0); } } return 0; } void search() { FILE* fp; fp = fopen("tel.txt", "r"); char str[1000]; char id[100]; char name[100]; int key; printf("Do you want to search by 1.ID or 2.name?(Enter number 1 or 2): "); scanf("%d", &key); if (key == 1) { printf("Enter search ID: "); scanf("%s", id); while (1) { if (fgets(str, sizeof(str), fp) == NULL) break; if (strstr(str, id) != NULL) { fgets(str, sizeof(str), fp); printf("%s", str); } } } else if (key == 2) { printf("Enter search Name: "); scanf("%s", name); while (1) { if (fgets(str, sizeof(str), fp) == NULL) break; if (strstr(str, name) != NULL) { fgets(str, sizeof(str), fp); fgets(str, sizeof(str), fp); printf("%s", str); } } } fclose(fp); } void assing() { int cnt = 0; char name[50]; char id[10]; char tel[15]; char department[30]; int c; int count = 0; FILE* fp; fp = fopen("tel.txt", "a+"); while ((c = getc(fp)) != EOF) { if (c == '\n') cnt++; } count = cnt / 5 + 1; rewind(fp); printf("Enter a new employee name:"); fgets(name, sizeof(name), stdin); printf("Enter a new employee tel number:"); fgets(tel, sizeof(tel), stdin); printf("Enter a new employee department:"); fgets(department, sizeof(department), stdin); fprintf(fp, "NAME: %s", name); fprintf(fp, "ID: TP0%d\n", count); fprintf(fp, "TEL: %s", tel); fprintf(fp, "DEP: %s", department); fprintf(fp, "========================\n"); fclose(fp); }

出力

==================Employee Management System============= 1. Search 2. assign 0. Exit ======================================================== Please enter your Choice:2 Enter a new employee name:Enter a new employee tel number:12345678 Enter a new employee department:1234567

case2の独立したプログラム

  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> char name[50]; char str[100]; char tel[15]; char department[30]; int c; int count = 0; int cnt; int main() { FILE* fp; fp = fopen("tel.txt", "a+"); while ((c = getc(fp)) != EOF) { if (c == '\n') cnt++; } count = cnt / 5 + 1; rewind(fp); printf("Enter a new employee name:"); fgets(name, sizeof(name), stdin); printf("Enter a new employee tel number:"); fgets(tel, sizeof(tel), stdin); printf("Enter a new employee department:"); fgets(department, sizeof(department), stdin); fprintf(fp, "NAME: %s", name); fprintf(fp, "ID: TP0%d\n", count); fprintf(fp, "TEL: %s", tel); fprintf(fp, "DEP: %s", department); fprintf(fp, "========================\n"); fclose(fp); return 0; }
Enter a new employee name:xxx Enter a new employee tel number:07000000000 Enter a new employee department:asia

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

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

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

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

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

guest

回答2

0

ベストアンサー

C言語のコードを書くなら、デバッグできる環境を整えましょう。
Eclipseや、WindowsならVisualStudioなど。
コードの任意の場所で実行を止め、変数のナカミを見ることができます。そこから1行づつ実行して、コードの流れを見れるようになります
そうすれば、アテズッポでコードを書かなくて済むようになります。

投稿2021/02/21 07:17

y_waiwai

総合スコア88038

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

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

kananananana

2021/02/21 07:42

VisualStudio2019を使用しています。
y_waiwai

2021/02/21 07:44

なら、そこのところでブレークポイント設定して、そこで実行を止め、変数の中身を見てみましょう。 なにがはいってるでしょうか。
kananananana

2021/02/21 08:17

name 0x006ffab0 "\n" char[50] [0] 10 '\n' char    [1] 0 '\0' char が入っていました。
y_waiwai

2021/02/21 08:23

別回答の通り、改行コードがはいってますね
y_waiwai

2021/02/21 08:29

scanfのあと、fgetsで1行空読みするとか、ですね。 scanfとfgetsってのはあんまし相性は良くないので、できればどちらかに統一したほうがいいですが。
kananananana

2021/02/21 08:38

なぜここに改行コードが入ってしまったんでしょうか? 空読することで解決しました! なぜ相性が良くないのでしょうか? 沢山聞いてしまってごめんなさい。
y_waiwai

2021/02/21 08:48

scanfってのは文字単位、数値単位で読むので、この場合のように処理残りが問題になります fgetsが1行単位で読んでくるもんなんで、そこらへんなにが起きるのか分かりづらいですね そうでなくとも、scanfという関数は、想定してない入力でフリーズしたり暴走さえするようになるような危険な関数です。実務では禁忌になってますんで、そのつもりで。
kananananana

2021/02/21 08:56

なるほど!理解出来ました。 ありがとうございます!
guest

0

assingに飛ぶ前のscanf("%d", &ch);を入力した際に残っていた改行文字を、Enter a new employee name:直後のfgetsで拾ってしまったのではないでしょうか?

投稿2021/02/21 06:33

maisumakun

総合スコア145975

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

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

kananananana

2021/02/21 08:38 編集

その通りでした!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問