前提・実現したいこと
_getch()を使用してシフトJISの1~2バイト文字を入力するプログラムを作りたい。
1バイト文字ならソースコードができていますが、2バイト文字にはどう対応していいのかわかりません。
該当のソースコード
C
1#include <stdio.h> 2#include <conio.h> 3 4void main() 5{ 6 /*--------変数・配列の宣言--------*/ 7 int iCount = 0; /* 入力した文字数を数える変数 */ 8 int iFlg = 0; /* 不正入力の有無のフラグ(1が不正入力) */ 9 char cInput = 0; /* 入力した文字を代入される変数 */ 10 char cBuffer[200] = {'\0'}; /* 入力した文字を出力するための配列 */ 11 12 printf("1_文字列を入力し、その文字列をそのまま出力します。\n"); 13 printf(" Enterで入力完了及びBackSpaceで一文字消去\n"); 14 15 printf("文字列を入力:"); 16 17 /*--------文字列の入力--------*/ 18 while(cInput != 0x0d) /* ループ条件:cInputがEnterでない間 */ 19 { 20 /*--------1文字ずつ入力--------*/ 21 while(1) /* 無限ループ */ 22 { 23 cInput = _getch(); /* 入力した文字をcInputに代入 */ 24 if(iCount != 0 || cInput != 0x08) /* 条件:iCountが0でないまたはcInputがBackSpaceでない時 */ 25 { 26 printf("%c", cInput); /* cInputを出力 */ 27 iCount++; /* 文字数をカウント */ 28 break; /* ループを抜ける */ 29 } 30 } 31 /*--------入力した文字の判定--------*/ 32 if( (cInput < 0x08) || ( (0x08 < cInput)&&(cInput < 0x0d) ) /* 条件:cInputがEnter,BackSpaceでない時 */ 33 || ( (0x0d < cInput)&&(cInput < 0x20) ) || (cInput == 0x7f) ) /* 条件:cInputが0x20~0x7eでない時 */ 34 { 35 printf("\n不正入力です。"); /* 不正入力を通知 */ 36 iFlg = 1; /* iFlgに1を代入 */ 37 break; /* ループを抜ける */ 38 } 39 else if(cInput == 0x08) /* 条件:cInputがBackSpaceの時 */ 40 { 41 printf(" %c", cInput); /* 一文字消去 */ 42 iCount = iCount - 2; /* iCountを-2する */ 43 } 44 else if(iCount == 1 && cInput == 0x0d) /* 条件:iCountが1で、かつcInputがEnterの時 */ 45 { 46 printf("\n不正入力です。"); /* 不正入力を通知 */ 47 iFlg = 1; /* iFlgに1を代入 */ 48 break; /* ループを抜ける */ 49 } 50 else if(cInput != 0x0d && iCount > 10) /* 条件:cInputがEnterでない、かつ入力した文字数が10文字を超えた時 */ 51 { 52 printf("\n不正入力です。"); /* 不正入力を通知 */ 53 iFlg = 1; /* iFlgに1を代入 */ 54 break; /* ループを抜ける */ 55 } 56 /*--------文字を配列に格納--------*/ 57 if(cInput != 0x08 && cInput != 0x0d) /* 条件:cInputがEnter,BackSpaceでない時 */ 58 { 59 cBuffer[iCount - 1] = cInput; /* Buffer[iCount - 1]にcInputを格納 */ 60 } 61 else if(cInput == 0x0d) /* 条件:cInputがEnterの時 */ 62 { 63 cBuffer[iCount - 1] = '\0'; /* Buffer[iCount - 1]にNUL文字を格納 */ 64 } 65 66 } 67 putchar('\n'); /* 改行 */ 68 /*--------文字列の出力--------*/ 69 if(iFlg == 0) /* 条件:iFlgが0の時 */ 70 { 71 printf("入力した文字列は「%s」です。\n", cBuffer); /* 入力した文字列を出力 */ 72 73 } 74}
追記
fgetsやgets_sでは文字以外の不正入力通知やオーバーフローの阻止ができるのでしょうか?
追記2
_getch()ではできないみたいなので、新しく別の質問を設置しました。ありがとうございました。
「C言語 fgetsで半分に切れてしまった2バイト文字を判定し、出力させないようにする方法」
https://teratail.com/questions/138562
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。