ページ 11

全角半角混じりの文字列を1文字ずつ表示する記述について

Posted: 2014年2月23日(日) 23:28
by wasawasa
文字列の文字を1文字ずつ全角か半角かを判定する記述について調べている途中に下記の「全角半角混じりの文字列を1文字ずつ表示する」旨の記述を拾ったのですが、これについて分からない所があったので質問させて頂きます。
この記述の中の「_mbclen((BYTE*)p)」が文字列pの先頭の文字のビット数を取得する記述、「tmp[x]=*(p++)」がp[0]をtmp[x]に格納する記述だとするなら、whileループの中のどこかで文字列pの全ての文字を一つずつ前にずらす操作が必要だと思うのですが、一体何処でその操作を行っているのでしょうか?

もし「tmp[x]=*(p++)」の記述だけでp[0]をtmp[x]に格納する操作と文字列pの全ての文字を一つずつ前にずらす操作が含まれているのなら、どの部分が「p[0]をtmp[x]に格納する操作」で、どの部分が「文字列pの全ての文字を一つずつ前にずらす操作」なのかを教えて頂けないでしょうか?

記述文

コード:

char *Str="あいabcうえお";
char *p=Str;
char tmp[3];
while(*p!='\0'){
    switch(_mbclen((BYTE*)p)){
    case 1:
        tmp[0]=*(p++);
        tmp[1]='\0';
        break;
    case 2:
        tmp[0]=*(p++);
        tmp[1]=*(p++);
        tmp[2]='\0';
        break;
    default:
        //error
        break;
    }
    printf("%s\n",tmp);
}
引用先:http://takabosoft.com/20011222183310.html

Re: 全角半角混じりの文字列を1文字ずつ表示する記述について

Posted: 2014年2月23日(日) 23:34
by みけCAT
wasawasa さんが書きました:この記述の中の「_mbclen((BYTE*)p)」が文字列pの先頭の文字のビット数を取得する記述、「tmp[x]=*(p++)」がp[0]をtmp[x]に格納する記述だとするなら、whileループの中のどこかで文字列pの全ての文字を一つずつ前にずらす操作が必要だと思うのですが、一体何処でその操作を行っているのでしょうか?
「文字列pの全ての文字を一つずつ前にずらす操作」は必要ありません。
tmp[x]=*(p++)という文を1回実行すると、まずp[0]の値がtmp[x]に格納され、その後p=p+1となるので、
次にtmp[x]=*(p++)を実行するときには、最初のtmp[x]=*(p++)を実行する前のp[1]の値がtmp[x]に代入されます。

Re: 全角半角混じりの文字列を1文字ずつ表示する記述について

Posted: 2014年2月24日(月) 10:56
by wasawasa
>みけCATさん
大変分かりやすい説明ありがとうございます。お陰で理解できました。