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

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

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

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

Q&A

解決済

1回答

2169閲覧

打ち込んだ数値をすぐに表示したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/07/08 22:58

1度質問したのですがいい結果がえられませんでした。

1今一度お願いいたします。 2void pos_training(void)の 3/* ブロックを選択させる */ 4 5 do { 6 printf("番号(練習中止は99):"); 7 scanf("%d\n", &temp); 8 if (temp == 99) return; /* 練習中止 */ 9 } while (temp < 1 || temp > 8); 10とMenu SelectMenu(void)のdo { 11 printf("\n練習を選択してください。\n"); 12 printf("(1) 単純ポジション (2) 複合ポジション\n"); 13 printf("(3) C言語の単語 (4) 英会話 (0) 終了 :"); 14 scanf("%d\n", &ch); 15 } while (ch < Term || ch >= InValid); 16でprintf("番号(練習中止は99):")と(0) 終了 :のあとに番号が 17すぐに出てこないでenter2回押しで表示されますが、すっきりしないのですが。 18番号を入力と同時に表示する方法をお願い致します。 19 20 21コード 22/* 総合タイピング練習 1部省略しています*/ 23 24#include <time.h> 25#include <stdio.h> 26#include <stdlib.h> 27#include <string.h> 28#include "getputch.h" 29#define NO 3 /* トレーニング回数 */ 30#define KTYPE 16 /* ブロック数 */ 31#define POS_LEN 10 /* ポジショントレーニングの文字数, 32 10個の文字がランダムに出題される */ 33/*--- 練習メニュー ---*/ 34typedef enum { Term, KeyPos, KeyPosComp, Clang, Conversation, InValid } Menu; 35/*--- Menuという型を定義できる Term=0,KeyPos=1 ... 36---*/ 37 38/*--- 各ブロックのキー ---*/ 39const char *kstr[] = { 40 "12345", "67890-^\\", /* 第1段 */ 41 "!\"#$%", "&'()=~|", /* 第1段 [Shift] */ 42 "qwert", "yuiop@[", /* 第2段 */ 43 "QWERT", "YUIOP`{", /* 第2段 [Shift] */ 44 "asdfg", "hjkl;:]", /* 第3段 */ 45 "ASDFG", "HJKL+*}", /* 第3段 [Shift] */ 46 "zxcvb", "nm,./\\", /* 第4段 */ 47 "ZXCVB", "NM<>?_", /* 第4段 [Shift] */ 48}; 49/*--- 文字列strを表示してタイプ練習(ミス回数を返す) ---*/ 50int go(const char *str) 51{ 52 int i; 53 int len = strlen(str); /* 文字数 */ 54 int mistake = 0; /* ミス回数 */ 55 for (i = 0; i < len; i++) { 56 57 /* str[i]以降を表示してカーソルを先頭へ戻す,正解すると文字が1ずつ消えて行く */ 58 printf("%s \r", &str[i]); 59 60 while (getch() != str[i]) { /* getch()はタイプされた文字を返す */ 61 mistake++; 62 } 63 } 64 return (mistake); 65} 66/*--- 単純ポジショントレーニング ---*/ 67void pos_training(void) 68{ 69 int i; 70 int stage; 71 int temp, line; 72 int len; /* 選ばれたブロックの文字列kstr[line]の長さlen 73 練習するブロックの文字数 */ 74 int qno, pno; /* 問題番号・前回の問題番号 */ 75 int tno, mno; /* 文字数・ミス回数 */ 76 clock_t start, end; /* 開始時刻・終了時刻 */ 77 printf("\n単純ポジショントレーニングを行います。\n"); 78 printf("練習するブロックを選択してください。\n"); 79 printf("第1段 (1) 左 %-8s (2) 右 %-8s\n", kstr[ 0], kstr[ 1]); 80 printf("第2段 (3) 左 %-8s (4) 右 %-8s\n", kstr[ 4], kstr[ 5]); 81 printf("第3段 (5) 左 %-8s (6) 右 %-8s\n", kstr[ 8], kstr[ 9]); 82 printf("第4段 (7) 左 %-8s (8) 右 %-8s\n", kstr[12], kstr[13]); 83 /* ブロックを選択させる */ 84 do { 85 printf("番号(練習中止は99):"); 86 scanf("%d", &temp); 87 if (temp == 99) return; /* 練習中止 */ 88 } while (temp < 1 || temp > 8); 89 line = 4 * ((temp - 1) / 2) + (temp - 1) % 2; 90 /* 練習者が打ち込んだキーボードのブロック番号1,2,3,4,5,6,7,8 を 91 *kstrの添字に変換する。出題するブロックの添字がlineに代入される 92 temp=1のときline=0、temp=2のときline=1、temp=3のときline=4、temp=4のときline=5 93 temp=5のときline=8、temp=6のときline=9、temp=7のときline=12、temp=8のときline=13 94 */ 95 printf("%d\n",temp); 96 97 printf("%sの問題を%d回練習します。\n", kstr[line], NO); 98 printf("スペースキーで開始します。\n"); 99 while (getch() != ' ') 100 ; 101 tno = mno = 0; /* 文字数・ミス回数をクリア */ 102 len = strlen(kstr[line]); /* 練習するブロックのキー数 */ 103 start = clock(); /* 開始時刻 */ 104 for (stage = 0; stage < NO; stage++) { 105 char str[POS_LEN + 1]; /* strの長さPOS_LEN + 1はstrの最後に\0を入れるため+1している。 */ 106 for (i = 0; i < POS_LEN; i++) /* 問題文字列を作成 */ 107 str[i] = kstr[line][rand() % len]; 108 str[i] = '\0'; /* strの最後に\0を入れる。 */ 109 mno += go(str); /* 関数goから戻るとミス回数であるgoの返却値をmnoに加える */ 110 tno += strlen(str); /* 出題した文字列の文字数をtnoに加える */ 111 } 112 end = clock(); /* 終了時刻 */ 113 printf("問題:%d文字/ミス:%d回\n", tno, mno); 114 printf("%.1f秒でした。\n", (double)(end - start) / CLOCKS_PER_SEC); 115} 116/*--- メニュー選択 ---*/ 117Menu SelectMenu(void) 118{ 119 int ch; 120 do { 121 printf("\n練習を選択してください。\n"); 122 printf("(1) 単純ポジション (2) 複合ポジション\n"); 123 printf("(3) C言語の単語 (4) 英会話 (0) 終了 :"); 124 scanf("%d", &ch); 125 } while (ch < Term || ch >= InValid); 126 127 printf("%d\n",(Menu)ch); 128 return ((Menu)ch); 129 130} 131int main(void) 132{ 133 Menu menu; /* メニュー */ 134 135 init_getputch(); /* p235に説明ある */ 136 init_getputch(); 137 /* --- ライブラリ初期処理 --- 138 static void init_getputch(void) 139 { 140 initscr(); //スクリーンを作成してライブラリ初期化する。cursesライブラリの利用時に最初に呼び出す 141 cbreak(); //行バッファリングを行わないようにする 142 noecho(); //タイプされたキーが画面に表示されないようにする 143 refresh(); //画面を消去する 144 } 145 */ 146 srand(time(NULL)); /* 乱数の種を初期化 */ 147 do { 148 switch (menu = SelectMenu()) { 149 150 case KeyPos : /* 単純ポジショントレーニング */ 151 case KeyPos : /* 単純ポジショントレーニング */ 152 pos_training(); 153 break; 154 case KeyPosComp : 155 pos_training2(); 156 break; 157 158 case Term: break; 159 case InValid: break; 160 case Term: break; 161 case InValid: break; 162 case Term: break; case InValid: break; 163 //教科書のコードにはないが、コンパイルでwarningが出るので追加した。 164 } 165 } while (menu != Term); 166 term_getputch(); /* p235に説明ある */ 167 /*--- ライブラリ終了処理 --- 168 static void term_getputch(void) 169 { 170 endwin(); //ライブラリ終了処理用の関数で、Cursesライブラリの利用時に 171 最後に呼び出さなければならない(画面上の文字がすべて消えてしまう) 172 } 173 */ 174 175 return (0); 176} 177/*実行結果 178C:\MinGW\users\chap08>gcc -I. -o kadai8-2-1 kadai8-2-1.c pdcurses.a 179C:\MinGW\users\chap08>kadai8-2-1 180C:\MinGW\users\chap08>gcc -I. -o typing4-1 typing4-1.c pdcurses.a 181C:\MinGW\users\chap08>typing4-1 182練習を選択してください。 183(1) 単純ポジション (2) 複合ポジション 184(3) C言語の単語 (4) 英会話 (0) 終了 :1(enter2回押しで表示される。) 185単純ポジショントレーニングを行います。 186練習するブロックを選択してください。 187第1段 (1) 左 12345 (2) 右 67890-^\ 188第2段 (3) 左 qwert (4) 右 yuiop@[ 189第3段 (5) 左 asdfg (6) 右 hjkl;:] 190第4段 (7) 左 zxcvb (8) 右 nm,./\ 191番号(練習中止は99):3(enter2回押しで表示される。) 192qwertの問題を3回練習します。 193スペースキーで開始します。 194qwretertwe (qが点滅で表示される。押すごとに消えていく) 195問題:30文字/ミス:2回 19633.4秒でした。 197練習を選択してください。 198(1) 単純ポジション (2) 複合ポジション 199(3) C言語の単語 (4) 英会話 (0) 終了 :0

C:\MinGW\users\chap08>

- /* getch/putch用ヘッダ "getputch.h" */ - - #if !defined(__GETPUTCH) - - #define __GETPUTCH - - #if defined(_MSC_VER) || (__TURBOC__) || (LSI_C) - - /* MS-Windows/MS-DOS(Visual C++, Borland C++, LSI-C 86 etc ...) */ - - #include <conio.h> - - static void init_getputch(void) { /* 空 */ } - - static void term_getputch(void) { /* 空 */ } - - - #else - - /* Cursesライブラリが提供されるUNIX/Linux/OS X */ - - #include <curses.h> - - #undef putchar - #undef puts - #undef printf - static char __buf[4096]; - - /*--- __putchar:putchar関数と同等(改行を[改行+復帰]で出力)---*/ - static int __putchar(int ch) - { - if (ch == '\n') - putchar('\r'); - return (putchar(ch)); - } - - /*--- putch:1文字表示してバッファを掃き出す ---*/ - static int putch(int ch) - { - int result = putchar(ch); - - fflush(stdout); - return (result); - } - - /*--- __printf:printf関数と同等(改行を[改行+復帰]で出力)---*/ - static int __printf(const char *format, ...) - { - va_list ap; - int count; - - va_start(ap, format); - vsprintf(__buf, format, ap); - va_end(ap); - - for (count = 0; __buf[count]; count++) { - putchar(__buf[count]); - if (__buf[count] == '\n') - putchar('\r'); - } - return (count); - } - - /*--- __puts:puts関数と同等(改行を[改行+復帰]で出力)---*/ - int __puts(const char *s) - { - int i, j; - - for (i = 0, j = 0; s[i]; i++) { - __buf[j++] = s[i]; - if (s[i] == '\n') - __buf[j++] = '\r'; - } - return (puts(__buf)); - } - - /*--- ライブラリ初期処理 ---*/ - static void init_getputch(void) - { - initscr(); - cbreak(); - noecho(); - refresh(); - } - - /*--- ライブラリ終了処理 ---*/ - static void term_getputch(void) - { - endwin(); - } - - #define putchar __putchar - #define printf __printf - #define puts __puts - - #endif - - #endif

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

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

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

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

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

otn

2017/07/09 02:08

コードと、地の文を分かるように書いてください。
guest

回答1

0

ベストアンサー

標準入力に入った改行コードを,scanf%d識別子だけでは消化しきれていない感じですかね。

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int num; 6 7 printf("Input: "); 8 if (scanf("%d%*[^\n]", &num) != 1) { 9 return 1; 10 } 11 scanf("%*c"); 12 printf("Output: %d\n", buffer); 13 14 printf("Input: "); 15 if (scanf("%d%*[^\n]", &num) != 1) { 16 return 1; 17 } 18 scanf("%*c"); 19 printf("Output: %d\n", buffer); 20 21 return 0; 22}

この方法を試してみてください。2回目の整数読み取りも正しく動作するはずです。

投稿2017/07/09 03:42

編集2017/07/09 03:47
mpyw

総合スコア5223

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問