質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1349閲覧

文字列

k_37

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/05/14 15:22

編集2016/05/14 17:07

文字列を比較するプログラムについてなのですが、
”苦しんで覚えるC言語”に記載されていたソースコードで、
1つ疑問があります。

C

1 2#include <stdio.h> 3#include <string.h> 4 5 6int main(void) 7{ 8 char str1[256],str2[] = "DRAGONQUEST"; 9 int i,len; 10 11 scanf("%s",str1); 12 13 len = strlen(str2); 14 15 for (i = 0;i < len + 1;i++) { 16 if (str1[i] != str2[i]) break; 17 } 18 19 if (i == len + 1) { 20 printf("同じ\n",i); 21 } else { 22 printf("違う,\n",i); 23 } 24 25 return 0; 26}

このプログラミングで、
str1の入力がループ強制脱出のifに偽の時、ループの条件式(i = 0;i < len + 1;i++)によると、iは11でループが終了するということになるのと思うのですが、その後のif (i == len + 1)で真の結果がでることが理解できません。
私の考えではループはiが11になったときに終了するので、iは11でlen + 1(11字+EOSで12)と等しくないと思うのですが、これはなぜiが12になるのでしょうか。

追記

c

1#include <stdio.h> 2#include <string.h> 3 4int main(void) 5{ 6 char str1[256],str2[] = "DRAGONQEST"; 7 int i,len; 8 9 scanf("%s",str1); 10 11 len = strlen(str2); 12 13 printf("%d\n",len); 14 15 for (i = 0;i < len + 1;i++){ 16 printf("str1[%d] = %c ,str2[%d] = %c\n",i,str1[i],i,str2[i]); 17 if (str1[i] != str2[i]) break; 18 } 19 20 21 printf("i(%d) == len + 1(%d)\n",i,len + 1); 22 if (i == len + 1) { 23 printf("同じ,i = %d ",i); 24 } else { 25 printf("違う,i = %d ",i); 26 } 27 28 return 0; 29}

iが12になるのか確認してみようとこのプログラムをしてみたのですが、やはり理解できませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HogeAnimalLover

2016/05/14 15:26

途中で変数の中身を表示させながらプログラム動作を追跡してみると良いよ。
k_37

2016/05/14 15:47

回答ありがとうございます。 iの値は11でループが終わるのですが、ループ後にiの変数を表示させると12に変わっています。どうしてでしょうか…
otn

2016/05/14 16:21

プログラムを ```C という行と ``` という行で囲んで下さい。
guest

回答2

0

ベストアンサー

「if (str1[i] != str2[i]) break; 」←でループを抜けることはない(つまり文字列は等しい)と仮定します。

そうするとループは条件「i < len + 1」が真である限り続きます。ということはループを抜けるときはこの逆「i >= len + 1」が真であると言えます。iは0から順に増えてきているのですから「i == len + 1」であるといえるはずです。

なお、「ループが終わる」というのは条件式(for()の真ん中)を計算してこれが偽(数字では0)であった時です。

投稿2016/05/14 15:58

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k_37

2016/05/14 16:51

回答ありがとうございます。 上記のプログラミングでループから抜け出すのはiが12のときで、その偽になったときのiの値の12がループ後のiに代入され、「i == len + 1」が成り立つということでしょうか。
HogeAnimalLover

2016/05/14 17:01

iに12が代入されるほうが先、この後 i < len + 1を計算して偽となりループを抜ける。当然この変数の状態は継続するのでi == len + 1は真となっています。ん?むしろ変数スコープの問題でしたか?変数iは関数の先頭で定義されているので、関数が終わるまでは値を保持し続けますよ。
k_37

2016/05/14 17:18

ループの条件式が真である間の最大値11がループ後のiに代入されると思っていました。 iに12が代入されからループ抜け出すので、ループ後のiが12になるのですね。 納得しました。ありがとうございます。
guest

0

こんちは。

ループの条件式(i = 0;i < len + 1;i++)によると、iは11でループが終了するということになるのと思う

単純な勘違いと思いますよ。落ち着いて考えてみてください。
str2は11文字ありますのでlen = strlen(str2);によりlenは11ですから、len+1は12です。
i < 12の条件が成立しない最低の
i
はいくつでしょうか?

投稿2016/05/14 15:52

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k_37

2016/05/14 16:57

回答ありがとうございます。 成立しない最低のiは12です。 成立する最大のi(11)がループ後のiに代入される、と考えていたのですが、 ここが勘違いでしょうか。
Chironian

2016/05/14 17:05

その通りです。 iに12が入ったのでループの継続条件が成立せずループを終了します。 その後、意図的にi の値を変更しないかぎり、最後の12が入っています。
k_37

2016/05/14 17:21

そういうことでしたか。 とてもスッキリしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問