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

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

ただいまの
回答率

90.50%

  • C

    3806questions

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

文字列

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 296

k_37

score 5

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

#include <stdio.h>
#include <string.h>


int main(void)
{
    char str1[256],str2[] = "DRAGONQUEST";
    int i,len;

    scanf("%s",str1);

    len = strlen(str2);    

    for (i = 0;i < len + 1;i++) {
        if (str1[i] != str2[i]) break;
    }

    if (i == len + 1) {
        printf("同じ\n",i);
    } else {
        printf("違う,\n",i);
    }

    return 0;
}

このプログラミングで、
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になるのでしょうか。

追記

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str1[256],str2[] = "DRAGONQEST";
    int i,len;

    scanf("%s",str1);

    len = strlen(str2);

    printf("%d\n",len);

    for (i = 0;i < len + 1;i++){
        printf("str1[%d] = %c ,str2[%d] = %c\n",i,str1[i],i,str2[i]);
        if (str1[i] != str2[i]) break;
    }


    printf("i(%d) == len + 1(%d)\n",i,len + 1);
    if (i == len + 1) {
        printf("同じ,i = %d ",i);
    } else {
        printf("違う,i = %d ",i);
    }

    return 0;
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • HogeAnimalLover

    2016/05/15 00:26

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

    キャンセル

  • k_37

    2016/05/15 00:47

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

    キャンセル

  • otn

    2016/05/15 01:21

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

    キャンセル

回答 2

checkベストアンサー

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/15 01:51

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

    キャンセル

  • 2016/05/15 02:01

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

    キャンセル

  • 2016/05/15 02:18

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

    キャンセル

+1

こんちは。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/15 01:57

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

    キャンセル

  • 2016/05/15 02:05

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

    キャンセル

  • 2016/05/15 02:21

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

    キャンセル

関連した質問

  • 受付中

    自然数以外が入力されたらエラー、3が付いていたら何かが返るようにしたい

    scantを使って、 入力されたものが、自然数で3が付いていたらyes 自然数でなかったら、エラーが返るようにしたいです。 よかったら教えてください。

  • 解決済

    C言語で配列を使い入力した文字列を逆順に表示するプログラムを作りたく、以下の様なプログラムを作りまし...

    C言語で配列を使い入力した文字列を逆順に表示するプログラムを作りたく、以下の様なプログラムを作りましたがうまく行きません。どこを変えればよいでしょうか?

  • 解決済

    スタックの応用

    スタックを利用して入力された文字列の回文を作るプログラムを作成したら、出力されません。 例えば、「abcd」と入力したら、「abcddcba」と主著力される。 発生して

  • 解決済

    cp -r コマンドのC言語による実装

    前提・実現したいこと ls -r コマンドのC言語のソースコードを参考にして cp -r コマンドを実装しているのですが どこを変えていいのかわかりません… 該当のソー

  • 受付中

    数字のみを受け付けたい

    前提・実現したいこと 数字のみを読み込ませる処理を行いたい 発生している問題・エラーメッセージ ループの一回目は文字をはじくのですが、1度でも数字が通ると、 その後は文

  • 解決済

    文字列のプログラムについて

    Cを使って3つの文字列を入力し一番文字数が最多の文字列を出力する(ただし最多の数と同じ数の文字列がある場合同じ数の文字列をすべて出力) というプログラムを作っているのですが今文字数

  • 解決済

    c言語学習中の学生です。

    前提・実現したいこと c言語を学んでいる学生です。 非常に低レベルな質問ですがお願いします。 Windows10でmingwを使っています。 発生している問題・エラーメッセージ

  • 解決済

    シーザー暗号についての問題

    シーザー暗号についての質問です 大文字を3字ずらす小文字を5字ずらすというプログラムを作っています。 ぶち当たった壁が大文字は3字ずらすことは可能なのですが小文字を5字ずらすことが

同じタグがついた質問を見る

  • C

    3806questions

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