全角のデータを逆から表示する方法 – プログラミング – Home

全角のデータを逆から表示する方法
 
通知
すべてクリア

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


保志
 保志
(@保志)
ゲスト
結合: 21年前
投稿: 2
Topic starter  

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

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

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


引用解決済
トピックタグ
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 21年前
投稿: 33
 

文字コードは何ですか?
Shift-JIS ですか?

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


返信引用
保志
 保志
(@保志)
ゲスト
結合: 21年前
投稿: 2
Topic starter  

すみません。
文字コードは、Shift-JIS です。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

例えば、配列に
1 2 3 4
というデータが入っていたら、
3 4 1 2
となればよいのです。

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


返信引用
謎の怪鳥
 謎の怪鳥
(@謎の怪鳥)
ゲスト
結合: 21年前
投稿: 12
 

余談的な話になりますけど、
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;
}
}

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

==


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました