【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21261

UTF-8とgetchar
投稿者---Naoki(2005/06/07 23:09:16)


文字数の制限をつけずに入力をするために、getchar関数とwhile文を使ったループで文字を入力しているのですが、日本語を入力した時に問題が起きます。

例えば「C言語」を入力して、バックスペースキーを2回押すと画面の表示では「語」だけが消えますが、入力されるのは「C言」と「語」の最初の1バイトで、16進数で表わすと「43 E8 A8 80 E8」になります。

今までに分かっているのは、入力がUTF-8であること、1回のバックスペースで1バイト削除されること、3回バックスペースキーを押せば入力される文字が1文字消えること、の3つだけです。

getchar関数のループでこのような問題をおこさない方法、または、ほかの関数で制限の無い入力はできませんでしょうか。

ソースは、次の通です。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
  int c;
  char *str;

  str = malloc(1);

  while ((c = getchar()) != '\n') {
    str = realloc(str, strlen(str) + 2);
    str[strlen(str)] = c;
  }
  str[strlen(str)] = '\0';

  printf("%s\n", str);

  free(str);

  return 0;
}

OSはLinuxで、コンパイルには「cc」コマンド、日本語入力は「Canna」を使っています。




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:UTF-8とgetchar 21268 あかま 2005/06/08 06:25:21


No.21268

Re:UTF-8とgetchar
投稿者---あかま(2005/06/08 06:25:21)


UTF-8の環境が用意できないのでバックスペースうんぬんはちょっと実験できなかったのですが、
投稿されたプログラムが「入力された文字列分の領域を動的に確保するプログラム」ならバグがあるかと思います。
1.文字列を初期化していない.直後のreallocのstrlenでえらいことに?
2.1文字読み込むたびに'\0'の上に文字を上書きするので文字列でなくなってしまう。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
  int c;
  char *str;

  str = malloc(1);
  *str = '\0';//1.の修正
  while ((c = getchar()) != '\n') {
    str = realloc(str, strlen(str) + 2);
    str[strlen(str)+1] = '\0';//2.の修正
    str[strlen(str)] = c;
  }
  str[strlen(str)] = '\0';

  printf("%s\n", str);

  free(str);

  return 0;
}




この投稿にコメントする

削除パスワード

No.21279

Re:UTF-8とgetchar
投稿者---Naoki(2005/06/08 19:30:56)


バグを発見して頂いたうえに、丁寧に修正をして頂き、感謝しております。

プログラムを組んでいて全く気づかず、文字を入力する以前の問題を作ってしまいました。この発見のおかげで、良いプログラムを作成できそうです。本当にありがとうございました。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧