• 締切済み

while文の条件

参考書でC言語を勉強しておりますが、タイトルの件で分からないことがあります。 #include <stdio.h> #include <string.h> void main(void) { char *p = "stop"; char str[80]; do { printf("文字列を入力してください:"); gets(str); }while(strcmp(p , str)); } while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、上記のwhile文だと、strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 なぜなのか分かりません。 どなたか教えてください。

  • ya-cha
  • お礼率68% (184/268)

みんなの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

条件文は論理式とは限りません、というか単に与えられたモノが0か否かで判断しているだけなので論理式でなくても成立します。 #これはifその他の条件分岐やループも全く一緒 ……って事でいいんだろうか。

ya-cha
質問者

お礼

ありがとうございました。

  • itinohana
  • ベストアンサー率41% (58/139)
回答No.4

質問者さんが書かれている通りの動作をしていると思いますが。 >while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、 と書いている通りなので、 >strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 当然、strcmpが0を返したら、Whileを抜けます。 ちなみに、strcmpは比較する文字列が一致した場合に0を返します。 異なっていれば、0以外の整数を返します。 全ての関数において、「0を返す=失敗」ではありません。

ya-cha
質問者

お礼

ありがとうございました。

  • LegaC2
  • ベストアンサー率52% (224/428)
回答No.3

> while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、上記のwhile文だと、strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 偽のときに抜ける認識であれば、偽のときに繰り返しを抜けることに、違和感はないと思いますが、質問文に記述間違いがありますか。 ”strcmp()が0を返す”=”入力された文字列が'stop'である”ということなので、入力された文字が'stop'以外なら処理を繰り返し、'stop'なら処理を終了します。

ya-cha
質問者

お礼

ありがとうございました。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

strcmp()の戻り値は「等しいときが0」「等しくない場合が0以外」です。これがまず重要。 do-while文の条件は、式が成り立っている場合=真=0以外にループを継続するため、 strcmp()で文字列が一致した場合の戻り値は「0」であり条件文を抜けます。

ya-cha
質問者

お礼

ありがとうございました。 同じ質問はミスです・・・。 投稿してから気づいたんですが、消し方が分からず・・・

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

http://gihyo.jp/dev/serial/01/c-programming-introduction/0017 ループは、条件が、真である間、繰り返されます。偽になったら、 ループを終了します。

ya-cha
質問者

お礼

ありがとうございました。

関連するQ&A

  • while文の条件

    参考書でC言語を勉強しておりますが、タイトルの件で分からないことがあります。 #include <stdio.h> #include <string.h> void main(void) { char *p = "stop"; char str[80]; do { printf("文字列を入力してください:"); gets(str); }while(strcmp(p , str)); } while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、上記のwhile文だと、strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 なぜなのか分かりません。 どなたか教えてください。

  • while文とif文

    #include <stdio.h> void main() { char str[2][6] = {"hello","lop"}; int i = 0; while(i < 2){ printf("%s\n", str[i++]); } } 上のプログラムの条件判定の部分にif文を つかうとhelloという文字列しか出力されず while文を使うとhelloとlop 二つ出力され ます。上の条件判定のif文にした時ととwhile 文にした時の違いはどこなのでしょうか?? どなたかご教授よろしくお願いしますm(_ _)m

  • C言語 strcmp 半角スペースがあるとだめ?

    C言語 strcmp 半角スペースが文字列に含まれている場合 文字列の比較がうまくいきません。半角スペースがあると比較できないのでしょうか? プログラム //strcmp #include <stdio.h> #include <string.h> int main(void){ char input[256]; char str[] = "HelloWorld!";   //char str[] = "Hello World!";だとうまくいかない。 printf("%s\n>", str); scanf("%s", input); if ( strcmp(input, str) == 0){ printf("同じです。\n"); }else{ printf("違います。\n"); } return 0; }

  • 文字列ポインタとgets関数の関係について。

    以下のプログラムはコンパイルは出来ますが、 実行するとクラッシュしてしまいます。 gets関数は char *gets( char *str ); と定義されているので文字列の先頭アドレスを返すはずですが 何故このプログラムはエラーが出るのでしょうか・・。 #include <stdio.h> int main ( void ){  char *p, *s;  p = gets(s);  printf("%s", p);  return 0; }

  • プログラムを上手く動かすには…

    与えられた文字列の文字を全て大文字に変換する関数letter2capを作成しなさい。関数letter2capではポインタを使用すること。 #include<stdio.h> #include<ctype.h> #define MAXCHAR 1024 void letter2cap ( char* ); int main( void ) { char str[MAXCHAR]; gets( str ); letter2cap( str ); printf("%sn",str); return 0; } void letter2cap( char* str) { while( *str ){ *str = toupper( *str ); } } 上手く動かすには何が足りないのでしょうか?

  • 配列のコピー

    配列bufの内容をstrにコピーしてgetsを使い 表示させたいのですが、うまくいかず 余計な文字まで出力されます、どのようにすれば うまくいくでしょうか? どなたかアドバイスよろしくお願いしますm(_ _)m #include <stdio.h> void main(){ char buf[256]="message"; char str[256]; int i = 0; while(buf[i] != NULL){ str[i] = buf[i]; i++; } printf(str); }

  • プログラムがうまく動きません…

    与えられた文字列の文字を全て大文字に変換する関数letter2capを作成しなさい。 ただし、main関数は以下のものを使用すること。 ただし、関数letter2capではポインタを使用すること。 #include<stdio.h> #define MAXCHAR 1024 void letter2cap( char* p) { while(*p) { if ('a' <= *p && *p <= 'z') *p += ('A' - 'a'); } } int main(void){ char str[MAXCHAR]; gets( str ); letter2cap( str ); printf(゛%s\n゛, str); return 0; } どこがまずいのでしょうか?教えて下さい。

  • 結果が不安定なプログラム

    配列に入れられた文字列を、別の配列に逆にして入れ、表示するというプログラムを作っています。 #include<stdio.h> #include<string.h> #include<stdlib.h> void main() {   char str1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", str2[] = "";   int i = 0, len = strlen(str1);   char *p1 = str1 + len - 1, *p2 = str2;   while(*(p1 - i) != str1[0] - 1) *(p2 + i) = *(p1 - i++);   printf("str1 = %s\n",p1 = str1);   printf("str2 = %s\n",p2); } 実行結果: str1 = ABCDEFGHIJKLMNOPQRSTUVWXYZ str2 = ZYXWVUTSRQPONMLKJIHGFEDCBA と出るのですが、この文字列を例えば"TANGOHYOJI"とかに変えてみると、実行は出来るんですがprintfの部分が表示されません。 また表示できても、文字が違う文字になって表示されたりします。 あと、この場合に使われている<stdlib.h>はどういった役割を果たしているのでしょうか?これがないとこのプログラムは動かなかったのですが・・。 どうかよろしくお願いします。

  • 再帰プログラム

    #include<stdio.h> int rstrlen(char*); int main(void) { char str[100]; printf("文字列を入力してください\n"); gets(str); printf("文字数は %d です\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p){ p++; return 1+rstrlen(p); } else return 0; } 文字数を計算するプログラムです。 if(*p)の*pとはNULLを表しているのですか?

  • C言語に詳しい方お願い致しいます

    文字列Aから文字列Bを除いた結果を表示するプログラムなのですが 一ヶ所分からない部分があります。 #include <stdio.h> #include <string.h> int main(void){  char str1[] = "abcdefg";  char str2[] = "cde";  char str3[128] = "";  char *p1 = str1, *p2;  size_t len;  len = strlen(str2);  while((p2 = strstr(p1,str2)) != NULL) {   strncat(str3,p1,p2 - p1);   p1 = p2 + len;   printf("----\n");   printf("p2=%s\n", p2);   printf("str3=%s\n", str3);   printf("p1=%s\n", p1);  }  strcat(str3,p1);  printf("%s\n",str3);  return 0; } while文中の p1 = p2 + len; なのですが、何故これでp1の内容が「fg」になるのでしょう。

専門家に質問してみよう