• ベストアンサー

うまくうごくけど警告が出る

課題で、「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言語初心者なので、よくわかりません。 このプログラム全体を含んで、 もっとスマート(かつ正確に)にするには どこをどう直せばよいでしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

strlen関数の戻り値の型は、符号なし整数です。 今回は、それとj(符号付き整数型)とを比較しているため、 当該の警告が出ます。 jを定義するとき、 unsigned int j; と書くか、 size_t j; と書けば、警告が出なくなるはずです。 ちなみに、size_tは、どこかのヘッダーファイルで typedef unsigned int size_t; のように、符号なし整数型の別名として定義していると思います。

その他の回答 (4)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★アドバイス ・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() 関数は必要ありません。 以上。

回答No.4

  j<strlen(month[i]) を、 month[i][j] にする。  

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

>「符号付き値と符号なし値の比較」 > という警告が出ました。 警告文そのまんまの意味です。 man strlen するとその宣言が知れて size_t strlen(const char *s); ですね。 size_t は大抵 unsigned int で定義されているので警告が出ます。 気になるならループカウンタも size_t で宣言しておいたら? あるいは自前でループせずに strchr() とかを使ってしまうとか。

noname#77845
noname#77845
回答No.1

動けばよいのなら、 for(j=0;j<(int)strlen(month[i]);j++){ で、警告は出なくなります。 int型にキャストしています。