ファイル入力した全角のデータを、一行づつ逆から表示させるプログラムを作成するために、悪
戦苦闘しています。全角は2バイトであることから、その点を考慮した上で変更していくとでき
るような気はするのですが、未だに分かりません。予想として、
for(i=0;i<n-1;i=i+2){
data2[i]=data1[n-i-3];
data2[i+1]=data1[n-i-2];
}
を使うであろうことは分かるのですが、その他のところに間違えがあるのか、どう試行錯誤して
も変化が見られません。どなたかアドバイスおねがいします。
文字コードは何ですか?
Shift-JIS ですか?
Shift-JIS なら「全角は2バイト」と仮定してもかまいませんが、半角文字も混じってい
る場合は、それも考慮しなくてはなりませんよ。
すみません。
文字コードは、Shift-JIS です。
例えば、配列に
1 2 3 4
というデータが入っていたら、
3 4 1 2
となればよいのです。
自分で作ったプログラムで
配列の中身がどのように変化するのか
1ステップずつ追跡して確認してみてください。
余談的な話になりますけど、
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;
}
}
/*==============================================*/
==