文字列の操作について

解決


ほるもん  2006-04-26 20:13:35  No: 61458  IP: 192.*.*.*

こんにちは。
現在の環境ですが、XP、VC++.NET2003(MFC)です。

文字列の操作なのですが、

char W_mae[23]; に" ABCD,efg hijkl,mnopqr"が入ってます。
char W_ato[31]; に"x%ABCD%z%EFG%x%HIJKL%z%MNOPQR%"と
セットしたいのですが.....。
 ","   → z
 " "   → x
ABCD   → %ABCD%
EFG    → %EFG%
HIJKL  → %HIJKL%
MNOPQR → %MNOPQR%  

どう言う編集の仕方をすれば良いのか検討が付かず
良いSample等、ありましたらおしえてください。

編集 削除
RiSK  2006-04-26 23:04:50  No: 61459  IP: 192.*.*.*

変換規則が曖昧です。また,大文字小文字が混在しています。
もっと仕様を明確にする必要があると思います。

適当に補完したコード(バッファオーバーフロー未考慮):
#include<stdio.h>
int main(void){
    const char W_mae[23]=" ABCD,efg hijkl,mnopqr";
    char W_ato[31];
    const char*p=W_mae;
    char*q=W_ato;
    int f=0;
    for(;*p;++p){
        if(*p==','||*p==' '){
            if(f)*q++='%';
            f=0;
            *q=*p==','?'z':'x';
        }else{
            if(!f)*q++='%';
            f=1;
            *q=*p;
        }
        ++q;
    }
    *q++='%',*q=0;
    puts(W_ato);
}

編集 削除
RiSK  2006-04-26 23:47:46  No: 61460  IP: 192.*.*.*

>    *q++='%',*q=0;

    if(f)*q++='%';
    *q=0;
の方がいいかも。

編集 削除
ほるもん  2006-04-27 09:28:25  No: 61461  IP: 192.*.*.*

RiSKさん。お返事ありがとうございます。

>char W_mae[23]; に" ABCD,efg hijkl,mnopqr"が入ってます。
char W_mae[23];    " ABCD,EFG HIJKL,MNOPQR"の間違いです。
すいません。

strstr関数を使用して、もっと簡単に出来るとのことなので
もう一度考えたいと思います。

編集 削除
ほるもん  2006-04-27 09:48:36  No: 61462  IP: 192.*.*.*

せっかく、教えて頂いたのに
失礼な返事の書き方をしてしまったと思い
もう一度書かせて頂きました。

>strstr関数を使用して、もっと簡単に出来るとのことなので
>もう一度考えたいと思います。

『strstr関数を使用しなさい』と、助言をうけ
ちょっとパニックになってしまいました。
strstr関数、使ったこと無いし。。。。

そのため、strstr関数を調べ
その上でもう一度考えたいと思います。

編集 削除
REE  2006-04-27 10:29:55  No: 61463  IP: 192.*.*.*

strstrは文字列を検索する関数なのでこの場合には向いてない気がします。
せめてstrchrですが、どちらにしても無理に使おうと思えば使える程度で、
スマートにはなりません。

strspnを検討する方が賢明ですね。

編集 削除
ほるもん  2006-04-27 14:24:53  No: 61464  IP: 192.*.*.*

>strspnを検討する方が賢明ですね。
strspnですが、検索してHITした数を調べる関数ですよね?

文字列を編集するのに何故、strspnが良いのか 分からないので
もし良ければ詳しく教えていただけないでしょうか。

宜しくお願いします。

編集 削除
通りすがり  2006-04-27 18:26:21  No: 61465  IP: 192.*.*.*

RiSKさんのいわれている通り、変換規則が曖昧過ぎるので
人によって違う解釈をされて答えが返ってくるのですよ。

REEさんはおそらく
・元の文字列は半角文字列
・","を"z"、" "を"x"に置換する
・","と" "の間に挟まれていた文字列の前後は"%"をつける
と解釈されたのでしょう

" "と","以外の半角文字を羅列したものを指定してstrspnを呼べば、
","と" "の位置がわかるので後は
・見つかった文字列を"%"ではさんで出力
  (先頭の" "が"x"になっただけということは、はさまれてない時は出力しない?)
・","か" "なのかを判別して"z"または"x"を出力
・検索を繰り返す

RiSKさんは
・","を"z"、" "を"x"に置換する
・","と" "の間に挟まれていた文字列の前後は"%"をつける
と解釈されたのでしょう

strstrを使えといわれたかたは
・","を"z"に置換する
・" "を"x"に置換する
・"ABCD"を"%ABCD%"に置換する
・"EFG"を"%EFG%"に置換する
・"HIJKL"を"%HIJKL%"に置換する
・"MNOPQR"を"%MNOPQR%"に置換する
・上記以外は変更しない
と解釈されたのでしょう


ところで
>strstr関数を使用して、もっと簡単に出来るとのことなので
>もう一度考えたいと思います。
これは誰に聞いたのですか?

編集 削除
REE  2006-04-27 18:58:34  No: 61466  IP: 192.*.*.*

失礼しました。
strspnではなく、strcspnでした。
#この辺ややこしい

編集 削除
ほるもん  2006-04-27 19:35:21  No: 61467  IP: 192.*.*.*

通りすがりさん。
ありがとうございます。

>>strstr関数を使用して、もっと簡単に出来るとのことなので
>>もう一度考えたいと思います。
>これは誰に聞いたのですか?
会社の先輩です。

質問の仕方、内容が悪く申し訳ありません。

実際は
char W_mae[30]; に"ABあCD,EいFG hiうjkl,mnえopqr"
※全角、半角、大文字、小文字を含んでます。
※スペースとカンマは(入力値)規則制はありません。

char W_kanma = "knm"; 
char W_spase = "sps";
 
結果、
char W_ato[256];へ"%ABあCD%knm%EいFG%sps%hiうjkl%knm%mnえopqr%"

詳細は情報の漏洩(仕事内容なので)で書けませんが、
SQL文を、入力値(ここで言うW_mae)で組み立てると言うものです。

多分、全角が入っているので、
strstrを使用した方が良いと言うことなのかなぁと思ってます。

編集 削除
RiSK  2006-04-27 22:13:41  No: 61468  IP: 192.*.*.*

通りすがりさん,すごー。
この情報でそこまで考えられるなんて。


>多分、全角が入っているので、
>strstrを使用した方が良いと言うことなのかなぁと思ってます。

全然よくありません。
「全角」という語を何も考えずに使っているうちは
はまるでしょうね。
# 「全角」ってどういう意味ですか?

charで処理するのは大変かもね。

編集 削除
ほるもん  2006-04-28 09:31:43  No: 61469  IP: 192.*.*.*

># 「全角」ってどういう意味ですか?
漢字、英字、カタカナ、ひらがな、数字で2バイト使用するもの
だと思っていますが、違うのでしょうか?

文字コードの話ですか?

MFCでダイアログにEdit Controlを作成し、
そこに入力される文字なのですが。。。。。。

>charで処理するのは大変かもね。
すいませんが教えてください。

編集 削除
ほるもん  2006-04-28 13:37:51  No: 61470  IP: 192.*.*.*

>>charで処理するのは大変かもね。
>すいませんが教えてください。
ちょっと甘えすぎました。
勉強不足で申し訳ありません。

Strcspn、strstrで検討したいと思います。

とりあえず、解決で閉じさせて頂きますが、
結論/作成完了したら返事を出させて頂きます。

3日間に渡り、RiSKさん、REEさん、通りすがりさん。
ありがとうございました。

編集 削除
ななし  2006-04-28 13:59:52  No: 61471  IP: 192.*.*.*

>MFCでダイアログにEdit Controlを作成し、
>そこに入力される文字なのですが。。。。。。
UNICODE文字を入力された場合は考慮されてます?

編集 削除