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

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

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

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

Q&A

解決済

1回答

361閲覧

c言語において、文字入力を受け取れない

yuto_jake

総合スコア42

C

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

0グッド

0クリップ

投稿2022/05/25 05:21

C言語を使用して、タスク情報を記録できるシステムを作成しています。addtaskのコード内から文字列を入力し、その後ファイルに書き換え、viewtaskの画面でtask情報を確認しできるコードを書こうと試みています。しかしコードを実行したところ、printf(Enter your task name:)の文字が表示されたすぐ後に(ENTER id:)が表示され、文字列の入力ができませんでした。
以下にソースコードをupしますので、原因と解決方法をご教授いただけますと幸いです。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4void addtask(); 5void viewtask(); 6char menu(); 7 8int main() { 9 char selection ; 10 11 do 12 { 13 selection = menu(); 14 switch(selection) 15 { 16 case '1': addtask(); 17 break; 18 case '2': viewtask(); 19 break; 20 case '5': printf("\nThank you for using Task manager!!^^"); 21 exit(0); 22 default: 23 printf("\nYou entered wrong choice..."); 24 printf("\nPress any key to try again"); 25 break; 26 } 27 } 28 while(selection != '9'); 29 return 0; 30} 31 32char menu() { 33 printf("\n\n\nWelcome to Task Management System!"); 34 printf("\nThis is Main Menu"); 35 char option; 36 printf("\n1) Add New Task"); 37 printf("\n2) Check your Task"); 38 printf("\n5) Exit"); 39 printf("\nEnter your choice: "); 40 scanf("%c[^\n]", &option); 41 return option; 42} 43 44void addtask() 45{ 46 char ch[100]; 47 int id, value; 48 printf("\nthis is add your Task"); 49 FILE * f = fopen("data.txt", "r+"); 50 if(f == NULL) 51 f = fopen("data.txt", "w"); 52 else 53 { 54 fseek(f, 0, SEEK_END); 55 printf("\nEnter your task name:"); 56 fgets(ch, sizeof(ch), stdin); 57 printf("\nENTER id:"); 58 scanf("%d", &id); 59 printf("\nEnter value: "); 60 scanf("%d", &value); 61 fprintf(f,"%s %d %d\n", ch, id, value); 62 } 63 fclose(f); 64} 65 66void viewtask(){ 67 char ch[]; 68 int i ,v; 69 printf("\nthis is display record"); 70 FILE * f = fopen("data.txt", "r"); 71 while(fscanf(f,"%s",&ch) != EOF){ 72 fscanf(f,"%d",&i); 73 fscanf(f,"%d",&v); 74 printf("\nTaskname: %s \t id: %d \t Value: %d", ch, i, v); 75 } 76 fclose(f); 77}

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

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

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

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

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

guest

回答1

0

ベストアンサー

menu()scanf() して、その後に fgets(, , stdin) しています。
C FAQ 12.18 と同様の問題です。

Q. scanfの%dを使って数字を読んで、文字列をgets()で読もうとしてい る。けれどコンパイラーはgets()の呼び出しを飛ばしているようだ。
A. ... 一般に、scanf()の呼び出しと、gets()(その他の入力ルーチンも)の 呼び出しを混ぜて使ってはいけない。... scanf()ですべて読み込むか、 scanf()を使わないかのどちらかである。

投稿2022/05/25 05:45

int32_t

総合スコア20790

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

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

yuto_jake

2022/05/25 10:44

int32_tさん、ご回答及び原因に関するご説明ありがとうございます。 scanf()の呼び出しと、gets()は一緒に使ってはいけないのですね。。勉強になりました。 scanf()でもう一度コードを書いてみようかと思います。 ご教授のほどありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問