野球選手名なら覚えられているのに、プログラムのことになると
覚えたそばから忘れていってしまいますね。僕だけでしょうか。
こんなプログラムを作ってみたのですが、失敗してしまいました。
「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言語からはじめるObjective-C超入門
- 作者: 掌田津耶乃
- 出版社/メーカー: Wiz Publishing
- 発売日: 2015/02/18
- メディア: Kindle版
- この商品を含むブログを見る