読者です 読者をやめる 読者になる 読者になる

底辺過ぎてちょっとビビる

26歳からIT業界にいるエンジニアが、まったく成長できてないことを確認するブログ。備忘録的に使いたいとも考えています。

【C言語】マルチバイト文字(日本語)を配列に格納して表示する

野球選手名なら覚えられているのに、プログラムのことになると

覚えたそばから忘れていってしまいますね。僕だけでしょうか。

 

 

こんなプログラムを作ってみたのですが、失敗してしまいました。

「char型配列に あいうえおかきくけこ=さしすせそ

という文字列を格納して、while文でループさせながら1文字ずつ表示する」

 

 

#include <stdio.h>


int main(void)
{
    int i = 0;
    int j = 1;
    char str[40] = "あいうえおかきくけこ=さしすせそ";

    while(strcmp(&str[i],"\0") != 0){
        /* 修正前 ①*/
        //printf("str=%c\n",str[i],str[i+1]);
        /* 修正後 ①*/
        printf("str=%c%c\n",str[i],str[j]);
        printf("i=%d j=%d\n",i,j);
       
        /* 修正前 ②*/
        //i = i + 1;
       
        /* 修正後 ②*/
        i = i + 2;
        j = j + 2;
    }
    return 0;
}

 

 

まず①

修正前のソースだと、まず日本語文字(マルチバイト文字)を表示しようとしているのに、「%c」を一つしか用意してない。

これが、abc...って1バイト文字ならOKだけど日本語なら修正後のように

「%c%c」

というようにしなくてはいけない。

(知らなかったんだよね。マジで)

 

そして②

配列の添字を1つずつ表示するのでループカウンタ1つだけでよかったのかもしれないが、

「あ」ならstr[0]str[1]

「い」ならstr[2]str[3]

 

というように添字が増えていくので、単純にインクリメントするだけだと

str[0]str[1] →str[1]str[2]→str[2]str[3]→str[3]str[4]・・・・

というように意図したものとは違ったズレかたをしてしまう。

なので、ループカウンタとしてiとjを用意するようにして修正した。

 

また、strcmp()の引数ですが、最初は

strcmp(str[i],'\0')

というように書いていましたが、strcmp の引数は 2つともchar * 型なので

strcmp(&str[i],"\0")というようにしなくてはいけなかった。

 

ちなみに上のプログラムは実行すると1バイト文字の=や/を考慮された作りになってないため、おかしな表示になる。はは・・・^o^;

 

 

 

 

 

苦しんで覚えるC言語

苦しんで覚えるC言語

 
Cの絵本―C言語が好きになる9つの扉

Cの絵本―C言語が好きになる9つの扉