Visual Studio C言語の質問
Visual Studio C言語の質問
Visual Studio Communityでテキスト処理プログラムを作ってますが、Win32コンソールから日本語を入力してその英語訳を入力させたいと考えてます。C言語からコンソールの半角、全角をしてすることはできるのでしょうか?よろしくお願いします。
Re: Visual Studio C言語の質問
http://www2.koyoen.birdview.co.jp/~abcx ... -z111-.PNG
>C言語からコンソールの半角、全角をしてすることはできるのでしょうか
C言語からコンソールの半角、全角を指定することはできるのでしょうか
の具体的な意味がわからないのですが 無いと思います。
具体的にどの様なことをされたいのか疑似コードで示して頂けませんか?
>C言語からコンソールの半角、全角をしてすることはできるのでしょうか
C言語からコンソールの半角、全角を指定することはできるのでしょうか
の具体的な意味がわからないのですが 無いと思います。
具体的にどの様なことをされたいのか疑似コードで示して頂けませんか?
Re: Visual Studio C言語の質問
ご返信有難うございます!下のように日本語と英語入力をユーザーに促してます。現在は、ユーザーがキーボードで全角、半角を切り替えて入力してますが、入力数が多いため、自動的に切り替えられるようにしたいのです。
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;
}
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;
}
Re: Visual Studio C言語の質問
ラベル
INPUT_JAPANESE:
の直後、日本語入力に固定
INPUT_ENGLISH:
の直後、英語入力に固定
したいということでしたら コンソールとは関係なく
使っている”日本語入力システム”を切り替えないといけないですよ。
INPUT_JAPANESE:
の直後、日本語入力に固定
INPUT_ENGLISH:
の直後、英語入力に固定
したいということでしたら コンソールとは関係なく
使っている”日本語入力システム”を切り替えないといけないですよ。
Re: Visual Studio C言語の質問
https://www.adminweb.jp/command/display/index5.html
コンソールではchcpコマンドで表示される文字コードを変更することが可能です。
それでよければ Cのsystem 命令で制御できると思います
コンソールではchcpコマンドで表示される文字コードを変更することが可能です。
それでよければ Cのsystem 命令で制御できると思います
Re: Visual Studio C言語の質問
古い記憶ですが、コンソールアプリケーションで IME の制御はできなかったような。
“C++ IME 制御” などと検索すると、いろいろサンプルプログラムも出てきますが、コンソールアプリケーションのものは見付からないので、できないのかもしれません。
“C++ IME 制御” などと検索すると、いろいろサンプルプログラムも出てきますが、コンソールアプリケーションのものは見付からないので、できないのかもしれません。
Re: Visual Studio C言語の質問
皆様、助言をありがとうございました。SYSTEM関数で少し遊ばれてみます。IMEの制御は一部のWEBサイトで行っているので言語によっては可能かと思いました。パスワードは半角固定ですから。しかし、銀行のオンラインサイトで全角と半角入力を切り替えなければならない場合が多いので、金額や口座番号を入れる時、ストレスがたまります。うまく行ったらご報告します!
これあからもよろしくお願いいたします。
MAT 拝
これあからもよろしくお願いいたします。
MAT 拝
Re: Visual Studio C言語の質問
全角半角切り替えをコードの中に入れてみました。
実行例
ただし、end を入力するときは、全角入力モードになっているので
ユーザが「漢字キー」を押す必要があります。
#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]
ユーザが「漢字キー」を押す必要があります。
Re: Visual Studio C言語の質問
input の中でループするのは変なので、書き換えてみました。
実行例
str_get_pointer_str_contained(text, word, front, rest) の意味が
分からないので省略しました。
#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
分からないので省略しました。