C言語関係掲示板

過去ログ

No.1317 単語の編集

[戻る] [ホームページ]
No.17703

単語の編集
投稿者---K.S(2004/11/01 22:56:03)


いつもお世話になります。
検索する単語を編集しています。
単語と単語の中に全角スペースがあった場合は半角スペースに変換する処理は出来ていますが、例えば”データ”を入力すると文字化け”デ璽”になってしまいます。”ー”が問題でしょうか?そこでstrstr条件で分岐していますが、”データ 比較”を入力した場合、全角スペースと”ー”が入っていますので、どういった対処すればよいのでしょうか?


  :
char *p ;
const char *rep = " " ; /* 半角スペース */
char buf[128] ;
char work[128] ;
char work2[128] ;
work[0] = '\0' ;

if( ! strstr( buf, " " ) == NULL ) {

  /* 全角スペース→半角スペースに変換 */
  for( p = strtok( buf, " " ) ; p ; p = strtok( 0, " " ) ) {
    strcat( work, p ) ;
    strcat( work, rep ) ;
  }
  work[strlen( work ) - strlen( rep ) ] = '\0' ;
  strcpy( work2, work ) ;
} else {
  strcpy( work2, buf ) ;
}
  :

ご教授宜しくお願い申し上げます。


No.17707

Re:単語の編集
投稿者---かずま(2004/11/02 01:18:22)


> 単語と単語の中に全角スペースがあった場合は半角スペースに変換する処理は
> 出来ていますが、例えば”データ”を入力すると文字化け”デ璽”になって
> しまいます。

出来ていないじゃないですか。文章は論理的に書いてください。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

void conv_space(const char *in, char *out)
{
    while (*in)
        if (memcmp(in, " ", 2) == 0)
            *out++ = ' ', in += 2;
        else {
            int len = mblen(in, MB_CUR_MAX);
            while (--len >= 0) *out++ = *in++;
        }
    *out = 0;
}

int main(void)
{
    char buf[256];
    setlocale(LC_CTYPE, "");
    conv_space("データ 比較", buf);
    puts(buf);
    return 0;
}



No.17714

Re:単語の編集
投稿者---K.S(2004/11/02 10:38:12)


ご回答ありがとうございます。
私の力不足ですみません。
conv_space()の中に間違いはないでしょうか?
実行してみたら、何も動かなかったです。
自分でも色々やってみましたら、どうしても出来なかったでした。
もう一度お願いできないでしょうか?

>> 単語と単語の中に全角スペースがあった場合は半角スペースに変換する処理は
>> 出来ていますが、例えば”データ”を入力すると文字化け”デ璽”になって
>> しまいます。
>
>出来ていないじゃないですか。文章は論理的に書いてください。
><pre>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>

void conv_space(const char *in, char *out)
{
while (*in)
if (memcmp(in, " ", 2) == 0)
*out++ = ' ', in += 2;
else {
int len = mblen(in, MB_CUR_MAX);
while (--len >= 0) *out++ = *in++;
}
*out = 0;
}

int main(void)
{
char buf[256];
setlocale(LC_CTYPE, "");
conv_space("データ 比較", buf);
puts(buf);
return 0;
}
</pre>



No.17715

Re:単語の編集
投稿者---ねむねこ(2004/11/02 11:06:32)


>conv_space()の中に間違いはないでしょうか?
>実行してみたら、何も動かなかったです。
WindowsXP, VC++6.0 SP6 で試してみたところ、
問題無く実行できました。


No.17716

Re:単語の編集
投稿者---K.S(2004/11/02 11:13:53)


>>conv_space()の中に間違いはないでしょうか?
>>実行してみたら、何も動かなかったです。
>WindowsXP, VC++6.0 SP6 で試してみたところ、
>問題無く実行できました。

私の方ではunixで使用しています。
ある関数だけが対応していないのでしょうか?
まさか、そんなことはないと思うけど・・・・



No.17717

Re:単語の編集
投稿者---あかま(2004/11/02 11:38:31)


>私の方ではunixで使用しています。
>ある関数だけが対応していないのでしょうか?
>まさか、そんなことはないと思うけど・・・・
Red Hat Linuxで試したらS-JISで保存しているのをコンパイルしたときは動かないですね。
当然ですが。

nkf -e < 元ファイル名 > 出力ファイル名

で文字コードをEUCにしてみてください。


No.17724

Re:単語の編集
投稿者---K.S(2004/11/02 14:32:48)


>>私の方ではunixで使用しています。
>>ある関数だけが対応していないのでしょうか?
>>まさか、そんなことはないと思うけど・・・・
>Red Hat Linuxで試したらS-JISで保存しているのをコンパイルしたときは動かないですね。
>当然ですが。
>
>nkf -e < 元ファイル名 > 出力ファイル名
>
>で文字コードをEUCにしてみてください。

-eってSJISからEUCに変換するコマンドですよね。
そのソースをtest.cに保存しますと、そのファイルはEUCですので、
そのままですが、、、それでも動かないです。





No.17725

Re:単語の編集
投稿者---あかま(2004/11/02 14:49:55)


>-eってSJISからEUCに変換するコマンドですよね。
入力がなんであれ、EUCに変換しますね。

>そのソースをtest.cに保存しますと、そのファイルはEUCですので、
>そのままですが、、、それでも動かないです。
実験してみましたか?
文字コード扱ってて動かない場合は、やはり文字コードが原因のことが多いです。
EUCで保存したつもりが実は…
なんてことがありますのでとりあえずはやってみてください。

それでできなければ、少し詳しい環境が必要かもしれません。

あと、nkfコマンドの入力ファイルと出力ファイルを同名にするとファイルの内容が消えますので注意(少なくとも私の環境では)


No.17727

Re:単語の編集
投稿者---かずま(2004/11/02 16:40:10)


> 私の方ではunixで使用しています。

unix だけでは分かりません。

たとえば、Linux の Fedora で環境変数 LANG=ja_JP.UTF-8 だと、
        if (memcmp(in, " ", 3) == 0)
            *out++ = ' ', in += 3;
にしないと、正しい結果が出ません。


No.17728

Re:単語の編集
投稿者---K.S(2004/11/02 18:45:09)


>> 私の方ではunixで使用しています。
>
>unix だけでは分かりません。
>
>たとえば、Linux の Fedora で環境変数 LANG=ja_JP.UTF-8 だと、
>
        if (memcmp(in, " ", 3) == 0)
            *out++ = ' ', in += 3;
にしないと、正しい結果が出ません。


ソースはSunOSを使用し、モジュールはTurboLinux8でMakeしています。
FedoraってRedHatだけ?Googleで検索してもTurboは見当たらなかったでした。上記のソースを変更しても変わらず、動きませんでした。
あかまさんの言うとおりに、文字コードが原因でしょうか?