- ベストアンサー
うまくうごくけど警告が出る
課題で、「r」がつく月の名前だけを表示するプログラムを作りました。 条件はポインタ配列とポインタ変数を使うことです。 一応、自力で作って以下のようになりました。 #include<stdio.h> #include <string.h> int main(void){ static char *month[]={"January","February","March","April","May", "June","July","August","September","October","November","December"}; char *pt; int i,j; for(i=0;i<12;i++){ pt=month[i]; for(j=0;j<strlen(month[i]);j++){ if(*pt=='r'){ printf("%s\n",month[i]);break; }pt++; } } return(0); } その結果、ちゃんと表示され、 うまく動いたんですが、 for(j=0;j<strlen(month[i]);j++){ の箇所に 「符号付き値と符号なし値の比較」 という警告が出ました。 C言語初心者なので、よくわかりません。 このプログラム全体を含んで、 もっとスマート(かつ正確に)にするには どこをどう直せばよいでしょうか??
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
strlen関数の戻り値の型は、符号なし整数です。 今回は、それとj(符号付き整数型)とを比較しているため、 当該の警告が出ます。 jを定義するとき、 unsigned int j; と書くか、 size_t j; と書けば、警告が出なくなるはずです。 ちなみに、size_tは、どこかのヘッダーファイルで typedef unsigned int size_t; のように、符号なし整数型の別名として定義していると思います。
その他の回答 (4)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・int len に代入してから比較をすれば良いのではないかな。 int len; len = strlen( month[i] ); for ( j = 0 ; j < len ; j++ ){ : 省略 : } またはポインタを使っているので \0 でループを抜けるようにします。 for ( i = 0 ; i < 12 ; i++ ){ pt = month[ i ]; while ( *pt != '\0' ){ ←for文で書き直せばスッキリ if ( *pt == 'r' ){ printf( "%s\n", month[i] ); break; } pt++; } } 文字列の最後は必ず \0 文字があります。 これをループの抜ける条件に使います。 そうすれば strlen() 関数は必要ありません。 以上。
- yaemon_2006
- ベストアンサー率22% (50/220)
j<strlen(month[i]) を、 month[i][j] にする。
- koko_u_
- ベストアンサー率18% (459/2509)
>「符号付き値と符号なし値の比較」 > という警告が出ました。 警告文そのまんまの意味です。 man strlen するとその宣言が知れて size_t strlen(const char *s); ですね。 size_t は大抵 unsigned int で定義されているので警告が出ます。 気になるならループカウンタも size_t で宣言しておいたら? あるいは自前でループせずに strchr() とかを使ってしまうとか。
動けばよいのなら、 for(j=0;j<(int)strlen(month[i]);j++){ で、警告は出なくなります。 int型にキャストしています。