固定長のテキストに区切り文字の","や"/"を挿入して整形する
プログラムを作っていたときWin98では正常に動作していましたが、
Win2000だと文字化けしてうまくいきません。
Unicodeとの文字コードの違いかな?とも思ったのですが、16bit
(2バイト)ということでバイト数は同じだと思うのですが、デバッカ
で見ると目的の位置より手前でカウントを終了しているようです。
というのもWin2000上ではデバッカのローカル変数をウオッチしても
変数内の漢字も文字化けしているため確認できません。
元のテキスト
"20010505文字列次の文字列1234"
こうしたい
"2001/05/05,文字列,次の文字列,12,34"
が、こうなる
"2001/05/05,文字・。・・次の文字・。、" (実際とは違います)
行儀が悪いプログラムなのですが、こんな感じです。
char kigou[7][2]={"/","/",","," ",":",":",""};
int skip[7]={4,2,22,12,2,2,2};
for(i=0;i<7;i++){
strncat(tmpbuff, pt, skip[i]);
tmpptr += skip[i];
strcat(tmpbuff,kigou[i]);
tmpptr += strlen(kigou[i]);
pt += skip[i];
}
コンパイラはBorlandC++Builder4です。
ファイルの整形だけなのでCの関数しか使っていません。
ご存知の方、回答よろしくお願いします。
No.2ベストアンサー
- 回答日時:
こんにちは。
的を得ていなくてすみません。
入力データを把握する意味で、入力データを全て16進で表示させてみては如何ですか?
for(i = 0; i < 1024; i++)
printf(" %02x", *(pt+i) & 0xff);
Win環境でプログラムを作ったことが最近ないので、一緒に悩んでしまってごめんなさい。 (^^;
この回答への補足
ははぁ、なるほど。
ファイルから読み込んだダンプリストとストリームから読み込んだデータのダンプを比べてみれば違いがわかりそうですね。
私もCプログラムが久しぶりなので思いつきませんでした。ちょっとやってみます。でも、違いがわかってもUnicodeだった場合の変換といおうか文字列の扱いはどうしたらいいんでしょうか・・。
pikacchuさん。ありがとうございます。
ダンプ出力して調べてみた結果、UnicodeではなくJISでした。(ホストマシンが古いので)少し容量が増えていたのも、漢字の開始、終了に伴う0x1b,0x24,0x40などのコードでした。JISコードは他の文字と領域が重なるため漢字の開始、終了に専用のコードが挿入されるのをすっかり忘れていました。何はともあれダンプのアイデアで解決できました。でもWin98環境ではどうして動いていたんだろう・・・?
No.1
- 回答日時:
こんにちは。
初歩的なことでもうしわけないですが、"tmpbuff"は'\0'(ヌル)で初期化されていますか?
ローカル変数と仮定すると起こりえるかと・・・
この回答への補足
省略したソースなのでご心配をおかけしました。
作業用の配列はすべてmemsetで初期化しております。
memset(tmpbuff,'\0',1024);
fgets()で読み込んでいるのですが、どうも漢字の部分が容量が増えている気配があります。(正確には数えていませんが・・)
Unicodeではストリームで読み込んだデータに何か付加する仕様になっているのでしょうか?半角数字は変化がないようです。
以上、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Visual Basic(VBA) VBA B列にある前から10文字のみ表示 3 2023/08/07 11:24
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Java Java 南京錠 2 2023/02/04 11:46
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sscanfとscanfの違いがよくわか...
-
CStringのFindで文字列検索を行...
-
fgets関数を使用したときの文字...
-
C言語 空白の行(改行のみ)が...
-
charと%c , %s の関係について
-
1行の文字列を時間差で表示する...
-
ブランクのチェック
-
エディットボックスに入力され...
-
反転した数値を表示させるやり方
-
C言語、単語ごとに改行したい
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
strstrを利用しない文字列検索...
-
小文字のみを数える方法
-
C言語 ポインタを使用した文字...
-
データ数値を16進文字列でprint...
-
16進数の文字列
-
スペースで区切って数字を入力
-
プログラミング シーザー暗号 ...
-
「an=(n-1)/(n+1)のときlim[n→∞...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
C言語のステップ数をカウントす...
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
ある文字列で2回目3回目に出現...
-
itoaわかりません
-
fgets関数を使用したときの文字...
-
fgetsで拾われる改行文字を削除...
-
C言語で16進数文字列から16進数...
-
CStringについて
-
文字列中に含まれる文字の個数...
-
strstrを利用しない文字列検索...
-
文の意味
-
エディットボックスに入力され...
-
文字列の途中に「0」がある場...
-
C++
-
putsとputcharの違い?
-
教えていただけませんか?C言語...
おすすめ情報