プロが教えるわが家の防犯対策術!

UNIX-Cにてファイルよりfgetc()を使用し1バイトずつ取り出し、
機種依存文字((1)やcm(全角1文字))を発見したら
"1"、"cm"(半角2文字)に変換したいと思っています。
現在、fgetc()の返却値はunsigned charポインタ(領域確保済みの別変数のアドレス代入済み)
へ待避しています。
そこで、
1.機種依存文字は文字としてヘッダに定義し、比較できるでしょうか?
2.機種依存文字であると判定した場合の文字変換方法がわかりません。(memcpy?)

A 回答 (2件)

あるていど、プログラムが書けそうな人なのに、何が分からないのか、よく分かりません。



・いわゆる全角の文字というのは二バイトだ
・対象となるファイルには、一バイトの文字も混在しているかもしれない
・漢字コードは何か分かっているか

というあたりを抑えておけば、そう難しくはないでしょう。

一バイトの文字は混在していない、と前提を置けば、

for (;;) {
  一文字目 = fgetc(...);
  if (ファイルのおしまいに来たら) {
    break;
  }
  二文字目 = fgetc(...);
  if (一文字目 == 機種依存文字(その1)の一文字目 && 二文字目 == 機種依存文字(その1)の二文字目) {
    fputs(置き換える文字列, …);
  } else if (機種依存文字(その2)も同様) {
    …
  } else {  /* 置き換えなくて良い場合 */
    fputc(一文字目, …);
    fputc(二文字目, …);
  }
}

ってな感じでしょうか。

ただ変換してゆくだけだったら、fgetc() で取得した文字を貯めておく必要はないですよね。

もし、一バイト文字も混在しているのであれば、fgetc() / fputc() ではなく、fgetwc() / fputwc() という
マルチバイト文字を扱う関数の方がシンプルに書けるでしょう。
    • good
    • 0

1.機種依存文字は文字としてヘッダに定義し、比較できるでしょうか?


できます。
文字というのは単なる数値(「0x6a」のようなメモリ上の数値)なので...
#define DEPENDENT_CHAR_01 ((unsigned char)0x6a)
#define DEPENDENT_CHAR_02 ((unsigned char)'A')
#define DEPENDENT_CHAR_03 "あ"
のようにできます(最後の行の定義は2バイトなので文字列にしています。memcmp()などで2バイト比較するなり1バイトずつ取り出して比較します)。


2.機種依存文字であると判定した場合の文字変換方法がわかりません。(memcpy?)
#1で書かれているとおりです。

確かに#1さんに同意見です。あとちょっとで何も聞かずに独力で実現できるところまできていますよね。がんばってください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!