• ベストアンサー

for

下記コードは私が昔作成したコードなのですが分からなくなってしまった部分があるので教えてください。 #include<stdio.h> void main(void){ int i; char fst[100],snd[100]; printf("文字列1:"); gets(fst); printf("文字列2:"); gets(snd); for(i=0;fst[i];i++){ if(fst[i] != snd[i]){ i++; printf("%d文字目が不一致です。\n",i); break; }else{ } } i--; if(fst[i]==snd[i]){ printf("一致しています。\n"); } } for(i=0;fst[i];i++){ の fst[i] の部分が分かりません。 これは一体どういう条件なのでしょうか? i<5等なら分かるのですが・・・ よろしくお願いします。

noname#50824
noname#50824

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

じゃあ、 if(fst[i]) {} なら分かるかな? if(expression) {} って、expressionが「0でない場合、真」になるよね。 で、fst[i]は、iをどんどん増やしていくと、「文字列の最後」でこれがfalseになる。abcという文字が入っているとすると、fst[0]='a', fst[1]='b', fst[2]='c', fst[3]='\0'になるのは分かるかな。ところで、「'\0'」というのは「(char)0」と似た意味で、値としては0となる。 なので、 for(i=0;fst[i];i++) と言うのは for(i=0;fst[i]!='\0';i++) と同義で、fst[i]が(C言語で文字列の最後を表す)0で無い限り続けるという意味やね。

noname#50824
質問者

お礼

めっさ理解できました。 ありがとうございます。

その他の回答 (1)

  • FAY
  • ベストアンサー率49% (95/193)
回答No.2

for文の構文は for( [init-expr]; [cond-expr]; [loop-expr] ) で、2番目の[cond-expr]を評価した結果が偽(0)でない場合は ループ内の処理を実行し、[cond-expr]を評価した結果が偽の場合は ループを抜けて次のステートメントを実行します。 なので for(i=0;fst[i];i++) というのはfst[i]が0になるまで (上のプログラムの場合文字列の終端まで) ループ内の処理を実行するということですね。 #個人的にはこう書いてほしくないですが。

noname#50824
質問者

お礼

>#個人的にはこう書いてほしくないですが。 確かに。自分でも分からなかった・・・ ありがとうございます。

関連するQ&A

  • for文~break

    break文に達した時、for文から抜けますか?それとも、if { }から抜けるんですか? for文はどこまで影響下にありますか? if ( i==5 ) printf ("サーバーが見つかりません"); まででしょうか? また  if ( i == 5 ) で5なら、実行としていますが、 6,や,8など5 以外でも、サーバーが見つかりません と if文が実行される見たいですが、なぜですか? 教えてください。 #include<stdio.h> int main(void) { int array[5][2]={ {1,14}, {2,28}, {3,19}, {4,8}, {5,15}, }; int sever; int i; printf("番号を入力してください"); scanf("%d",&sever); for( i=0 ; i<5 ; i++ ) if ( sever == array[i][0] ){ printf ( "%d 番には, %d 人います。\n",sever,array[i][1]); break; } if (i==5) printf("サーバーが見つかりません"); return 0; }

  • C言語プログラミング 初心者

    現在2つの文字列を比較するstrcmp()関数と同じ動作をするプログラムを制作しています。 もちろん、strcmp()は一切用いません。 何とか作ってみたものの、文字列が等しいときなどにはうまく作動しません。 分かる方アドバイスお願いします。 以下のプログラムでは2つの50文字以下の文字列を入力することを想定しています。 #include<stdio.h> int main(void) { char str1[50],str2[50]; int a,b,i; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /*文字列の長さを確認します*/ for(a = 0;str[a];a++) ; for(b = 0;str2[b];b++) ; printf("%s ha %d mozinonagasadesu\n",str1,a); printf("%s ha %d mozinonagasadesu\n",str2,b); /*文字列を比較します*/ for(i = 0;;i++){ if(str1[i] > str2[i]) printf("%s は %s より大きい\n"str1,str2); else if(str1[i] < str2[i]) printf("%s は %s より小さい\n"str1,str2); if(str1[i] > str2[i] || str1[i] <str2[i]) break; } for(i=0;str1[i] && str2[i];i++) if(str1[i] == str2[i] ) printf("文字列は等しい\n"); /*上のプログラミングだとstr1がaab、str2がaacのときも文字列が等しいと表示してしまうので、ぴったり等しいときのみ表示するにはどのように条件付けしたらよいでしょうか?*/ return 0; } ちなみにstr1[0]=a ,str1[1]=b, str2[0]=a, str[1]=b, str[2]=cが格納されていた場合、str1 < str2になると思うのですが正しいでしょうか? もし正しければこの場合str1[2]にはヌル文字が入っており、それがstr2[2]のcと比較されたためなのでしょうか? いろいろと質問してしまいましたが、分かる方解答お願いします。

  • C言語で分からないところがあるのですが

    すみません。C言語のポインタで分からないことがあって来ました。 ポインタの理屈は理解してはいるのですが、いざソースコードを書いてみようということになると全く手がつけられずにいます。 以下のソースコードですが、strlen()と同じ働きをする関数mystrlen()と、strcmp()と同じ働きをする関数mystrcmpを、ポインタを使って作成するものです。どこをどうすればいいのか教えてくださいませんか。 #include <stdio.h> int main(void) { char str1[80], str2[80]; int i, j; int len1, len2; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /* * 文字列の長さを確認する */ /* NULL文字(文字列の最後)まで読み飛ばす */ for (len1 = 0; len1 < 80 && str1[len1] != '\0'; len1++) ; /* ループ終了後、len1 に文字列の長さが入っている */ if (len1 < 80) { printf("%s は %d 文字の長さです\n", str1, len1); } else { printf ("第1の文字列が80字以上あります\n"); } /* str2 についても同様 */ for (len2 = 0; len2 < 80 && str2[len2] != '\0'; len2++) ; if (len2 < 80) { printf("%s は %d 文字の長さです\n", str2, len2); } else { printf ("第2の文字列が80字以上あります\n"); } if (len1 < 80 && len2 < 80) { for (i = 0; i < 80 && str1[i] != '\0' && str2[i] != '\0' && str1[i] == str2[i]; i++) ; if (str1[i] == str2[i]) { /* 両者同時に == '\0' のはず*/ printf("文字列は等しい\n"); } else if (str1[i] < str2[i]) { /* str1[i] == '\0' のはず*/ printf("%s は %s より小さい\n", str1, str2); } else { /* str2[i] == '\0' のはず*/ printf("%s は %s より大きい\n", str1, str2); } } /* * 十分なスペースがあれば、str2をstr1の最後に連結する */ if (len1 + len2 < 80) { /* str1 の末尾を探す */ for (i = 0; str1[i] != '\0'; i++) ; /* ループを抜けた段階では i は len1 と同じはずなので、 上記のループを作らず、i の代わりに len1 を用いるのも可 */ /* それ以降に str2 の中身をコピーする */ for (j = 0; str2[j] != '\0'; j++) { str1[i+j] = str2[j]; } str1[i+j] = '\0'; printf("%s\n", str1); } else { printf ("文字列をつなげた長さが80字以上あります\n"); } /* * str2をstr1にコピーする */ if (len1 + len2 < 80) { for (i = 0; str1[i] != '\0'; i++) { str1[i] = str2[i]; } str1[i] = '\0'; printf("%s %s\n", str1, str2); } return 0; }

  • プログラムの添削

    以下のようなプログラムを作りました.よりよい書き方,アドバイスなどお願いします. /*文字列の入力を繰り返し受け取るプログラムを作成しなさい.*/ #include<stdio.h> #include<string.h> int main(void) { char bigstr[101],str[31]; printf("文字列の入力を繰り返し受け取るプログラムです.\n"); strcpy(str,""); strcpy(bigstr,""); for(;;) { printf("文字列を入力してください.\n"); gets(str); if(strlen(str)>30) { printf("入力できる文字数の上限(20字)を超えました.\n"); return 0; } else if(strcmp(str,"quit")) { strcat(bigstr,str); if(strlen(bigstr)>100) { printf("入力できる文字数の上限(合計100字)を超えました.\n"); return 0; } } else break; } printf("%s\n",bigstr); return 0; }

  • プログラムの間違っている箇所が分かりません

    文字列の置換プログラムを作りたいのですが、下記のプログラムでは正常に動きませんでした。 例えば、「call」の「ll」を「sell」と変換しようとするとエラーがでてしまいます。 プログラミング初心者なので、どこが間違っているのかよく分からないです。 以下、問題のあるプログラムを記述します。 #include <stdio.h> void change(char *in, char *bef, char *af){     char tmp[100];     int i = 0, j = 0;     int flg=0;         for(i = 0; *(af + i) != '\0'; i++){         tmp[i] = *(af + i);     }     tmp[i] = '\0';     for(j = 0; *(in + j) != '\0'; j++){     if(flg == 0 && *(bef + j) == '\0'){             flg = 1;     }         if(flg == 1){             tmp[i++] = *(in + j);             tmp[i] = '\0';         }     }     for(j = 0; j<=i; j++){         *(in + j) = tmp[j];     } } int check(char *in, char *bef){       int i=0;     int flg=0;     while(*(bef+i)!='\0'){             if(*(in+i)=='\0' || *(in+i)!=*(bef+i)){             flg=1;             break;         }         i++;     }     return flg; } int main(){     char in[100];     char bef_ch[20];     char af_ch[20];     int i=0;     printf("文字列を入力して下さい。\n");     gets(in);     printf("置換したい文字列を入力して下さい。\n");     gets(bef_ch);     printf("置換後の文字列を入力して下さい。\n");     gets(af_ch);     while(in[i]!='\0'){         if(check(&in[i], &bef_ch[0]) == 0){             change(&in[i], &bef_ch[0], &af_ch[0]);         }         i++;     }     printf("置換結果を示します。\n");     printf("%s\n",in);     return 0; }

  • for文内でscanf関数により配列に数値を格納することについて

    プログラミング初心者です。 よろしくお願いします。 ◎1------------------------------------ #include<stdio.h> int main(void) { int i,dt[3]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[3]=%d\n",dt[3]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("dt[3]=%d\n",dt[3]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- ◎2------------------------------------ #include<stdio.h> int main(void) { int i,dt[2]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- 以上2つのプログラムについて疑問があります。 まず◎1については、あえて添え字のdt[3]の値を見てみようと思ったら、iの値が入っているとわかりました。 しかし、何故添え字の番号の配列にiの値が入っているのかがわかりません。 次に◎2ですが、3回目のループで、添え字の番号の配列自身に入力した数値を格納すると、iと添え字番号配列に入力した数値が入っていました。 何故このようになっているのか疑問です。 以上のような疑問があります。 添え字の番号の配列とiが何か関連があるようですがいまいちわかりません。 教えていただけると嬉しいです。

  • C言語 配列 文字列

    配列と文字列をあわせて使う以下のようなプログラムを作りました.エラーはでないのですが,最後のprintfの部分が表示されません.どこが間違っているのでしょうか? /*文字列を入力し,入力した文字列を逆の順番で表示するプログラム*/ #include<stdio.h> #include<string.h> int main(void) { int i,n,t; char mozi[100]; printf("100字以下の文章を入力したら,逆にして表示します.\n"); gets(mozi); n=strlen(mozi); if(n%2) { for(i=0;i<(n-1)/2;i++) { t=mozi[i]; mozi[i]=mozi[n-i]; mozi[n-i]=t; } } else { for(i=0;i<n/2;i++) { t=mozi[i]; mozi[i]=mozi[n-i]; mozi[n-i]=t; } } printf(mozi); return 0; }

  • 検索させるプログラムです。

    文字列を入力させて、その後に検索キー入力をし、先ほど入力した文字列のなかから 一致するものを検索するプログラムです。 #include <stdio.h> int searchidx(char a[],char key) { int i=0,j=0; a[3]=key; for(i=0;i<3;i++){ if (a[i] == key){ j++; break; } } if(j==0){ return(-1); }else{ return(i); } } int main(void) { int a,i; char ky=0; char x[3]; printf("3個の文字を入力してください。\n"); for (i = 0; i < 3; i++) { printf("x[%d]:", i); scanf("%s", &x[i]); } printf("検索キー:"); scanf("%s", &ky); a=searchidx(x,ky); if (a == -1){ puts("一致しません。"); }else{ printf("%d\n",a); printf("%s\n",x[a]); } } メイン関数で文字列を入力させ、その配列とキー値をサーチ関数に渡して 一致した時の配列の添え字をaに返してメイン関数で文字列の配列のその添え字x[a]で表示されるのではないか?と思ってそうしてるつもりなのですが 実行してみると最後の一致した結果を表示させるところでエラーがでます。 表示させるところの前のprintfで一致するものの要素数が帰ってくるかどうかのチェックを入れてますが ちゃんと添え字番号は正しく返ってくるのになぜ最後の printf("%s\n",x[a]); ではダメなのでしょうか? それとscanfって%sのときは&いらなかったと思うのですが この場合&を入れないとエラーになってしまいます。

  • forループに関する疑問。

    プログラミングの練習中、下に記したようなfor文がありましたが、どうしても理解できない部分があります。 2行目での実行条件としてi < noと書かれているのにno%i == 0になるのは何故なのでしょう? 申し訳ありませんがよろしくお願いします。 for( no=2;no<=1000;no++){ for(i=2;i<no;i++){ counter++; if(no%i==0) break; } printf("%d\n",no); }

  • MacでC言語を勉強しています

    最近C言語に興味を持って 趣味程度に、ハーバート・シルトさん著の「独習C」を、 Xcodeを使ってCが使える感じにして、 プログラミングを打って、ビルドして、コンソールで結果を見て、ふむふむ、ってやっていたのですが、 第8章の総合理解度チェックの問題で、 「簡単な図書カードカタログプログラムを作成してください。 ~省略~ ユーザーが「1.入力」を選んだ場合には、書名、著者名、出版社を繰り返し入力させます。書名として空白行が入力されるまで、これを続けます。~~省略~~」 ということになっていまして、この入力を選んだ場合がうまくいきません・・・。作り途中のプログラムですが・・・ /*8の総合理解度チェック2test1「メニュー関数の完成」*/ #include <stdio.h> #include <string.h> #define MAX 100 void inputf(void); void name_sarch(void); void title_sarch(void); char names[MAX][80], titles[MAX][80], pubs[MAX][80]; int main(void) { int i; do { printf("図書カードカタログ:\n"); printf(" 1.入力\n"); printf(" 2.著者名による検索\n"); printf(" 3.書名による検索\n"); printf(" 4.終了\n"); printf("いずれかを選択してください:"); scanf("%d", &i); switch (i) { case 1: inputf(); break; case 2: name_sarch(); break; case 3: title_sarch(); break; case 4: break; default: printf("メニューにありません\n"); break; } } while (i != 4); printf("正常に終了します"); return 0; } /*インプット部分*/ void inputf(void) { int i; for (i = 0; i < MAX; i++){ printf("書名を入力してください:"); gets(titles[i]); if (! *titles[i]) break; printf("著者名を入力してください:"); gets(names[i]); printf("出版社を入力してください:"); gets(pubs[i]); } if (i == MAX) printf("これ以上は入力出来ません\n"); } /*著者名による検索*/ void name_sarch(void) { int i; printf("臨時テスト関数です\n書名の配列番号を入力してください"); scanf("%d", &i); printf("%s", titles[i]); } /*書名検索*/ void title_sarch(void) { printf("書名検索関数\n"); } と作りまして、これをコンパイルしてコンソールで見ると、 『 [Session started at 2008-03-18 21:30:34 +0900.] 図書カードカタログ: 1.入力 2.著者名による検索 3.書名による検索 4.終了 いずれかを選択してください:1     (←僕はここで1を押して、enterキーを押しました) warning: this program uses gets(), which is unsafe. 書名を入力してください:図書カードカタログ: 1.入力 2.著者名による検索 3.書名による検索 4.終了 いずれかを選択してください: 』 と言うふうに勝手に、書名の部分をエンターでか、終わらせて、メニューに帰ってきてしまいます。 これは一体どういう事で、どうすれば解決できるんでしょうか、是非教えてください。

    • ベストアンサー
    • Mac

専門家に質問してみよう