全角のデータを逆から表示する方法

[戻る]
保志 [E-Mail] 2004/01/23(金) 23:50:56
ファイル入力した全角のデータを、一行づつ逆から表示させるプログラムを作成するために、悪
戦苦闘しています。全角は2バイトであることから、その点を考慮した上で変更していくとでき
るような気はするのですが、未だに分かりません。予想として、

     for(i=0;i<n-1;i=i+2){
         data2[i]=data1[n-i-3];
         data2[i+1]=data1[n-i-2];
      }

を使うであろうことは分かるのですが、その他のところに間違えがあるのか、どう試行錯誤して
も変化が見られません。どなたかアドバイスおねがいします。

渋木宏明(ひどり) [HomePage] 2004/01/24(土) 00:50:05
文字コードは何ですか?
Shift-JIS ですか?

Shift-JIS なら「全角は2バイト」と仮定してもかまいませんが、半角文字も混じってい
る場合は、それも考慮しなくてはなりませんよ。

保志 [E-Mail] 2004/01/24(土) 09:02:07
すみません。
文字コードは、Shift-JIS です。

dairygoods 2004/01/24(土) 10:30:12
例えば、配列に
  1  2  3  4
というデータが入っていたら、
  3  4  1  2
となればよいのです。

自分で作ったプログラムで
配列の中身がどのように変化するのか
1ステップずつ追跡して確認してみてください。

謎の怪鳥 2004/01/28(水) 15:31:44
余談的な話になりますけど、
Win32では以下のAPIが用意されていますので、
1バイト文字と2バイト文字が混在している場合には
役に立ちます。

(1) IsDBCSLeadByte()
  指定された文字が2バイト文字セットの
  先行バイトかどうかを判断することが出来ます。

(2) CharNext() / CharPrev()
  それぞれ、指定された文字の次の文字へのポインタと
  前の文字へのポインタを取得します。

/*==============================================*/

LPCTSTR p , q;
TCHAR szBuffer1[512]; /* コピー元 */
TCHAR szBuffer2[512]; /* コピー先 */

lstrcpy(szBuffer1 , _T("あい1う23え4お56"));

p = szBuffer1;
q = szBuffer2 + lstrlen(szBuffer1);
*q = 0;
while(*p){
  if(IsDBCSLeadByte((BYTE)*p)){
    /* 2バイト文字が見つかった
       → ポインタqを2バイトずらして2バイトをコピー */
    q -= 2;
    *((WORD *)q) = *((WORD *)p);
  }else{
    /* 1バイト文字が見つかった 
     → ポインタqを1バイトずらして1バイトをコピー */
    *--q = *p;
  }
  p = CharNext(p);
}

もしくは、

p = szBuffer1 + lstrlen(szBuffer1);
q = szBuffer2;
while(p != szBuffer1){
  p = CharPrev(szBuffer1 , p);
  if(IsDBCSLeadByte((BYTE)*p)){
    /* 2バイト文字が見つかった
       → 2バイトをコピーしてポインタqを2バイトずらす */
    *((WORD *)q) = *((WORD *)p);
    q += 2;
  }else{
    /* 1バイト文字が見つかった 
       → 1バイトをコピーしてポインタqを1バイトずらす */
    *q++ = *p;
  }
}

/*==============================================*/

==

古いスレッドには追加発言できません。