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

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

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

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

Q&A

解決済

2回答

4610閲覧

[C言語] 文字を入出力するプログラムを作りたい

tarot_shogun

総合スコア29

C

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

0グッド

1クリップ

投稿2018/01/17 02:29

編集2018/01/17 03:20

文字を入出力するプログラムを作っています。
具体的には以下のようなプログラムです。

・文字を入力し[Enter]キーを押すと文字が出力される
・入力できる最大の文字数は20文字
・[BackSpace]キーで文字の削除が出来る

自分で一応は作ってみたのですが、
[BackSpace]を押すと、
・入力した文字数が20文字に達していなくても、それ以上入力できなくなる。
・カーソル位置が不安定になり、消したい文字を消せないことがある。
とうまく動作しません。

下記のプログラムのどこが悪いのでしょうか?
あるいはもっと綺麗に書くことはできないでしょうか?

助言いただけるようでしたら、解説のほどよろしくお願いします。

C

1#include <stdio.h> 2#include <conio.h> 3#define ENTER_KEY 0x0D 4#define BS_KEY 0x08 5 6int main(void) 7{ 8 int ch; 9 int count = 0; /* 入力された文字数 */ 10 11 while ((ch = _getch()) != ENTER_KEY) 12 { 13 if (ch == BS_KEY) 14 { 15 if (count < 20) 16 { 17 putchar(BS_KEY); 18 } 19 putchar(' '); 20 putchar(BS_KEY); 21 count--; 22 } 23 24 if (ch != BS_KEY) 25 { 26 putchar(ch); 27 count++; 28 } 29 30 if (count >= 20) 31 { 32 putchar(BS_KEY); 33 count--; 34 } 35 } 36 37 return 0; 38}

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

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

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

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

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

episteme

2018/01/17 02:40

「入力された文字が20文字のとき、うまく文字を削除することができません。」なにが/どのようにうまくいかんかを記せ。
tarot_shogun

2018/01/17 03:06

失礼しました。「入力された文字が20文字のとき、うまく文字を削除することができません。」⇒「入力された文字が20文字のとき、うまく文字を削除することができません。」と修正しました。
guest

回答2

0

ベストアンサー

  • 20文字まで入力時、カーソル位置とcount変数の状態が一致しなくなる
  • 0文字時にもBSキーが効いている

のがおかしいです。
以下のようにキー入力判定、カーソル制御、文字数判定を見直すとよいでしょう。

C

1N = 20 2while(){ 3 if( BSキー){ 4 if( 1文字以上){ 5 一文字削除(後退+スペース出力+後退)する 6 count--; 7 } 8 } 9 else{ // それ以外 10 if( N文字未満){ 11 入力文字を1文字出力する 12 count++; 13 } 14 } 15}

なお、上記コードでは[Tab]や[Delete]キーなどは入力しないことを前提としています。
これらの入力も考慮するならelse{部分で弾く(入力を無視する)必要があります。

投稿2018/01/17 04:22

編集2018/01/17 04:31
can110

総合スコア38262

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

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

tarot_shogun

2018/01/17 05:27

おかげ様でプログラムの実現ができました 。 can110 様、episteme 様、ありがとうございました。
guest

0

backspaceをputcharしても後退動作してくんないんじゃないかな。
※ printf("ac%cb", BS_KEY) すると "ab"って出力されますか?

端末に対しescape-sequenceでも送らんならんのでは?(端末が対応していれば、だけど)。

投稿2018/01/17 02:58

episteme

総合スコア16614

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

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

tarot_shogun

2018/01/17 03:07

回答ありがとうございます。 backspaceをputcharで後退動作はしてくれるようです。 printf("ac%cb", BS_KEY) すると "ab"と出力されました。
episteme

2018/01/17 03:13

ならOKか。 > [BackSpace]を押すと、20文字以上記述できなくなってしまいます。 仕様が「入力できる最大の文字数は20文字」であるなら、↑は期待通りの挙動じゃないんですか? どうなってほしかったんですか?
tarot_shogun

2018/01/17 03:22

何度もすいません。 ・入力した文字数が20文字に達していなくても、それ以上入力できなくなる。 と修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問