Visual Studio C言語の質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マット1

Visual Studio C言語の質問

#1

投稿記事 by マット1 » 5年前

Visual Studio Communityでテキスト処理プログラムを作ってますが、Win32コンソールから日本語を入力してその英語訳を入力させたいと考えてます。C言語からコンソールの半角、全角をしてすることはできるのでしょうか?よろしくお願いします。

Math

Re: Visual Studio C言語の質問

#2

投稿記事 by Math » 5年前

http://www2.koyoen.birdview.co.jp/~abcx ... -z111-.PNG

>C言語からコンソールの半角、全角をしてすることはできるのでしょうか

C言語からコンソールの半角、全角を指定することはできるのでしょうか

の具体的な意味がわからないのですが 無いと思います。

具体的にどの様なことをされたいのか疑似コードで示して頂けませんか?

Math

Re: Visual Studio C言語の質問

#3

投稿記事 by Math » 5年前

>Win32コンソールから日本語を入力してその英語訳を入力させたいと考えてます。

どちらも入力ですか?

マット1

Re: Visual Studio C言語の質問

#4

投稿記事 by マット1 » 5年前

ご返信有難うございます!下のように日本語と英語入力をユーザーに促してます。現在は、ユーザーがキーボードで全角、半角を切り替えて入力してますが、入力数が多いため、自動的に切り替えられるようにしたいのです。

INPUT_JAPANESE:
printf("このセルの中で英語化したい語を入力してください。エンターで直さず次の語彙に行きます。\n");
printf(" ASCII文字が一部入っていてもOKです。\"end\"で選択に戻ります。\n");
fgets(word, sizeof(word), stdin); clear_newline(word);// コンソール入力
if (isstrempty(word))
{ printf("[%ld]{%s} is generated.\n", i, sLine.Word[2]);
continue;
}
if (isstrequal(word, "end"))
return(1);
if (isstrascii(word))
{ puts(" 入力した語は全てASCIIです。変換不要。エンターを押して下さい。\n");
goto JAPANESE_INPUT;
}

CHANGE_SAME_LINE:
a = str_get_pointer_str_contained(text, word,front,rest);// 取り出したMultiByte語の後からのポインタ=a

INPUT_ENGLISH:
printf(" 英語をASCIIで入力してください。\n");
fgets(eng, sizeof(eng), stdin); clear_newline(eng);// コンソール入力
if (!isstrascii(eng) || isstrempty(eng))
{
puts(" 不適切な入力!ASCII文字を入れて下さい!\n");
goto INPUT_ENGLISH;
}

Math

Re: Visual Studio C言語の質問

#5

投稿記事 by Math » 5年前

ラベル
INPUT_JAPANESE:
の直後、日本語入力に固定

INPUT_ENGLISH:
の直後、英語入力に固定

したいということでしたら コンソールとは関係なく
使っている”日本語入力システム”を切り替えないといけないですよ。

Math

Re: Visual Studio C言語の質問

#6

投稿記事 by Math » 5年前

https://www.adminweb.jp/command/display/index5.html

コンソールではchcpコマンドで表示される文字コードを変更することが可能です。

それでよければ Cのsystem 命令で制御できると思います

Bull
記事: 149
登録日時: 9年前

Re: Visual Studio C言語の質問

#7

投稿記事 by Bull » 5年前

古い記憶ですが、コンソールアプリケーションで IME の制御はできなかったような。
“C++ IME 制御” などと検索すると、いろいろサンプルプログラムも出てきますが、コンソールアプリケーションのものは見付からないので、できないのかもしれません。

マット1

Re: Visual Studio C言語の質問

#8

投稿記事 by マット1 » 5年前

皆様、助言をありがとうございました。SYSTEM関数で少し遊ばれてみます。IMEの制御は一部のWEBサイトで行っているので言語によっては可能かと思いました。パスワードは半角固定ですから。しかし、銀行のオンラインサイトで全角と半角入力を切り替えなければならない場合が多いので、金額や口座番号を入れる時、ストレスがたまります。うまく行ったらご報告します!

これあからもよろしくお願いいたします。
MAT 拝

かずま

Re: Visual Studio C言語の質問

#9

投稿記事 by かずま » 5年前

全角半角切り替えをコードの中に入れてみました。

コード:

#pragma comment(lib,"user32.lib")
#include <stdio.h>
#include <windows.h>

char word[256], eng[256], text[256], *a;
int front, rest;

void change_kanji_mode(void)  // 全角半角切り替え
{
	keybd_event(VK_KANJI, 0, 0, 0);
	keybd_event(VK_KANJI, 0, KEYEVENTF_KEYUP, 0);
}

int isstrempty(const char *s) { return !*s; }

int isstrequal(const char *a, const char *b) { return !strcmp(a, b); }

int isstrascii(const char *s)
{
	char c;
	while (c = *s++)
		if (c & 0x80) return 0;
	return 1;
}

char *str_get_pointer_str_contained(char *text, char *word, int front, int rest)
{
	return strcpy(text, word);
}

void clear_newline(char *word)
{
	char *p = strchr(word, '\n');
	if (p) *p = '\0';
}

int input(void)
{
	*word = '\0';
	while (1) {
		while (1) {  // INPUT_JAPANESE:
			puts("このセルの中で英語化したい語を入力してください。\n"
				"  エンターで直さず次の語彙に行きます。\n"
				"  ASCII文字が一部入っていてもOKです。\"end\"で選択に戻ります。");
			change_kanji_mode();
			fgets(word, sizeof(word), stdin);
			change_kanji_mode();
			clear_newline(word);
			if (isstrempty(word)) {
				//printf("[%ld]{%s} is generated.\n", i, sLine[i].Word[2]);
				continue;
			}
			if (isstrequal(word, "end")) {
				change_kanji_mode();
				return 1;
			}
			if (!isstrascii(word)) break;
			puts(" 入力した語は全てASCIIです。変換不要。エンターを押して下さい。");
		}
	CHANGE_SAME_LINE:
		// 取り出したMultiByte語の後からのポインタ=a
		a = str_get_pointer_str_contained(text, word, front, rest);
				
		while (1) {  // INPUT_ENGLISH:
			puts(" 英語をASCIIで入力してください。");
			fgets(eng, sizeof(eng), stdin);
			clear_newline(eng);// コンソール入力
			if (isstrascii(eng) && !isstrempty(eng)) break;
			puts(" 不適切な入力!ASCII文字を入れて下さい!\n");
		}
	}
}

int main(void)
{
	input();
	printf("text=[%s], eng=[%s]\n", text, eng);
}
実行例

コード:

このセルの中で英語化したい語を入力してください。
  エンターで直さず次の語彙に行きます。
  ASCII文字が一部入っていてもOKです。"end"で選択に戻ります。
愛
 英語をASCIIで入力してください。
love
このセルの中で英語化したい語を入力してください。
  エンターで直さず次の語彙に行きます。
  ASCII文字が一部入っていてもOKです。"end"で選択に戻ります。
end
text=[愛], eng=[love]
ただし、end を入力するときは、全角入力モードになっているので
ユーザが「漢字キー」を押す必要があります。

かずま

Re: Visual Studio C言語の質問

#10

投稿記事 by かずま » 5年前

input の中でループするのは変なので、書き換えてみました。

コード:

#pragma comment(lib,"user32.lib")
#include <stdio.h>   // printf, puts, fgets
#include <string.h>  // strcmp, strchr, strcpy
#include <windows.h> // keybd_event

char word[256], eng[256];

void change_kanji_mode(void)  // 全角半角切り替え
{
	keybd_event(VK_KANJI, 0, 0, 0);
	keybd_event(VK_KANJI, 0, KEYEVENTF_KEYUP, 0);
}

int isstrempty(const char *s) { return !*s; }

int isstrequal(const char *a, const char *b) { return !strcmp(a, b); }

int isstrascii(const char *s)
{
	while (*s)
		if (*s++ & 0x80) return 0;
	return 1;
}

void clear_newline(char *word)
{
	char *p = strchr(word, '\n');
	if (p) *p = '\0';
}

int input(void)
{
	while (1) {  // INPUT_JAPANESE:
		puts("このセルの中で英語化したい語を入力してください。\n"
			"  エンターで直さず次の語彙に行きます。\n"
			"  ASCII文字が一部入っていてもOKです。\"end\"で選択に戻ります。");
		change_kanji_mode();
		fgets(word, sizeof(word), stdin);
		change_kanji_mode();
		clear_newline(word);
		if (isstrempty(word)) {
			//printf("[%ld]{%s} is generated.\n", i, sLine[i].Word[2]);
			continue;
		}
		if (isstrequal(word, "end")) {
			change_kanji_mode();
			return 1;
		}
		if (!isstrascii(word)) break;
		puts(" 入力した語は全てASCIIです。変換不要。エンターを押して下さい。");
	}
	while (1) {  // INPUT_ENGLISH:
		puts(" 英語をASCIIで入力してください。");
		fgets(eng, sizeof(eng), stdin);
		clear_newline(eng);// コンソール入力
		if (isstrascii(eng) && !isstrempty(eng)) break;
		puts(" 不適切な入力!ASCII文字を入れて下さい!\n");
	}
	return 0;
}

int main(void)
{
	while (!input())
		printf("word=[%s], eng=[%s]\n", word, eng);
}
実行例

コード:

このセルの中で英語化したい語を入力してください。
  エンターで直さず次の語彙に行きます。
  ASCII文字が一部入っていてもOKです。"end"で選択に戻ります。
愛
 英語をASCIIで入力してください。
love
word=[愛], eng=[love]
このセルの中で英語化したい語を入力してください。
  エンターで直さず次の語彙に行きます。
  ASCII文字が一部入っていてもOKです。"end"で選択に戻ります。
あなた
 英語をASCIIで入力してください。
you
word=[あなた], eng=[you]
このセルの中で英語化したい語を入力してください。
  エンターで直さず次の語彙に行きます。
  ASCII文字が一部入っていてもOKです。"end"で選択に戻ります。
end
str_get_pointer_str_contained(text, word, front, rest) の意味が
分からないので省略しました。

返信

“C言語何でも質問掲示板” へ戻る