- 締切済み
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)
- C・C++・C#
- 回答数5
- ありがとう数5
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- D-Matsu
- ベストアンサー率45% (1080/2394)
条件文は論理式とは限りません、というか単に与えられたモノが0か否かで判断しているだけなので論理式でなくても成立します。 #これはifその他の条件分岐やループも全く一緒 ……って事でいいんだろうか。
- itinohana
- ベストアンサー率41% (58/139)
質問者さんが書かれている通りの動作をしていると思いますが。 >while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、 と書いている通りなので、 >strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 当然、strcmpが0を返したら、Whileを抜けます。 ちなみに、strcmpは比較する文字列が一致した場合に0を返します。 異なっていれば、0以外の整数を返します。 全ての関数において、「0を返す=失敗」ではありません。
お礼
ありがとうございました。
- LegaC2
- ベストアンサー率52% (224/428)
> while文は条件が真(0でない)の場合に繰り返し、偽(0)の場合に抜けるという認識なんですが、上記のwhile文だと、strcmp()の戻り値が0の場合(偽)に繰り返しを抜けます。 偽のときに抜ける認識であれば、偽のときに繰り返しを抜けることに、違和感はないと思いますが、質問文に記述間違いがありますか。 ”strcmp()が0を返す”=”入力された文字列が'stop'である”ということなので、入力された文字が'stop'以外なら処理を繰り返し、'stop'なら処理を終了します。
お礼
ありがとうございました。
- arain
- ベストアンサー率27% (292/1049)
strcmp()の戻り値は「等しいときが0」「等しくない場合が0以外」です。これがまず重要。 do-while文の条件は、式が成り立っている場合=真=0以外にループを継続するため、 strcmp()で文字列が一致した場合の戻り値は「0」であり条件文を抜けます。
お礼
ありがとうございました。 同じ質問はミスです・・・。 投稿してから気づいたんですが、消し方が分からず・・・
- kokorone
- ベストアンサー率38% (417/1093)
http://gihyo.jp/dev/serial/01/c-programming-introduction/0017 ループは、条件が、真である間、繰り返されます。偽になったら、 ループを終了します。
お礼
ありがとうございました。
関連する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の場合(偽)に繰り返しを抜けます。 なぜなのか分かりません。 どなたか教えてください。
- 締切済み
- C・C++・C#
- 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・C++・C#
- 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; }
- ベストアンサー
- C・C++・C#
- 文字列ポインタとgets関数の関係について。
以下のプログラムはコンパイルは出来ますが、 実行するとクラッシュしてしまいます。 gets関数は char *gets( char *str ); と定義されているので文字列の先頭アドレスを返すはずですが 何故このプログラムはエラーが出るのでしょうか・・。 #include <stdio.h> int main ( void ){ char *p, *s; p = gets(s); printf("%s", p); return 0; }
- ベストアンサー
- C・C++・C#
- プログラムを上手く動かすには…
与えられた文字列の文字を全て大文字に変換する関数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 ); } } 上手く動かすには何が足りないのでしょうか?
- ベストアンサー
- C・C++・C#
- プログラムがうまく動きません…
与えられた文字列の文字を全て大文字に変換する関数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; } どこがまずいのでしょうか?教えて下さい。
- 締切済み
- C・C++・C#
- 結果が不安定なプログラム
配列に入れられた文字列を、別の配列に逆にして入れ、表示するというプログラムを作っています。 #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>はどういった役割を果たしているのでしょうか?これがないとこのプログラムは動かなかったのですが・・。 どうかよろしくお願いします。
- ベストアンサー
- C・C++・C#
- 再帰プログラム
#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・C++・C#
- 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」になるのでしょう。
- 締切済み
- C・C++・C#
お礼
ありがとうございました。