『やさしいC』よりポインタの学習

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
strm
記事: 6
登録日時: 8年前

『やさしいC』よりポインタの学習

#1

投稿記事 by strm » 8年前

おはようございます。
質問をさせていただきます。

現在『やさしいC』で学習をしているのですが、
以下のコードが理解できません。

コード:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int length(char *str);

int main(void)
{
	char str[100];
	int ans;

	printf("文字列を入力してください。\n");
	scanf("%s", str);

	ans = length(str);

	printf("文字列の長さは%dです。\n", ans);

	return 0;
}

int length(char *str)
{
	int c;
	c = 0;

	while (*str){
		c++;
		str++;
	}
	
	return c;
}
length関数の部分が分かりません。
なにをどのようにして文字列の長さを測定しているのでしょうか。
どうやって偽判定にして(while文を抜けて)いるのかも理解できないです。str++で0に到達しているロジックが分からず……。

初歩的な質問、また分かりにくい文章で申し訳ありません。
どなたかお願いいたします。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: 『やさしいC』よりポインタの学習

#2

投稿記事 by naohiro19 » 8年前

コード:

while (*str){
        c++;
        str++;
    }

コード:

for(int i = 0; str[i] != '\0'; i++){
    c++;
}
と書いたのと同じになります。

strm
記事: 6
登録日時: 8年前

Re: 『やさしいC』よりポインタの学習

#3

投稿記事 by strm » 8年前

ありがとうございます。
ですが、申し訳ありません。
何がどうなってそうなるのか……。

str++をループすることで0(偽)にしてwhile文を抜け出し、
「ループの回数=C=文字数」をmain関数に返すコードなのだということは分かります。(間違っていたらごめんなさい)
しかし根本的に、なぜstrをインクリメントしていった結果ループを抜けるのかという部分が理解できないです。

と、書いていて思ったのですが、インクリメントしていった結果strに格納された「\0」に到達すると、
それは「0」であり偽となってループを抜けるのでしょうか。
つまり\0は0として扱っていいということなのでしょうか。

あまりにも初歩的な部分が無理解で情けなくなりますが、申し訳ありません。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 『やさしいC』よりポインタの学習

#4

投稿記事 by みけCAT » 8年前

strm さんが書きました:と、書いていて思ったのですが、インクリメントしていった結果strに格納された「\0」に到達すると、
それは「0」であり偽となってループを抜けるのでしょうか。
つまり\0は0として扱っていいということなのでしょうか。
以下の引用はN1570よりです。

scanfはfscanfの第一引数にstdinを渡したものと同じです。
7.21.6.4 The scanf function さんが書きました:2 The scanf function is equivalent to fscanf with the argument stdin interposed
before the arguments to scanf.
fscanfの%sは読み込んだデータの後にnull文字を格納します。
7.21.6.2 The fscanf function さんが書きました:s Matches a sequence of non-white-space characters. 286)
If no l length modifier is present, the corresponding argument shall be a
pointer to the initial element of a character array large enough to accept the
sequence and a terminating null character, which will be added automatically.
null文字のビットは全てゼロです。
5.2.1 Character sets さんが書きました: A byte with
all bits set to 0, called the null character, shall exist in the basic execution character set; it
is used to terminate a character string.
よって、scanfで読み込んだ文字列を最初から1文字ずつ見ていくと、いつかnull文字に出会い、そのデータは0です。
while文は、制御式が0になるまでループするので、裏を返せば制御式が0になったら、すなわちnull文字に出会ったらループを抜けます。
6.8.5 Iteration statements さんが書きました:1 iteration-statement:
while ( expression ) statement
(略)
4 An iteration statement causes a statement called the loop body to be executed repeatedly
until the controlling expression compares equal to 0.
ちなみに、'\0'はnull文字を表します。
6.4.4.4 Character constants さんが書きました:12 EXAMPLE 1 The construction '\0' is commonly used to represent the null character.
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

strm
記事: 6
登録日時: 8年前

Re: 『やさしいC』よりポインタの学習

#5

投稿記事 by strm » 8年前

ありがとうございます。疑問が氷解しました。
基礎部分をおざなりにして進んできたしまった証拠ですね。精進します。

また質問することもあると思いますが、よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 『やさしいC』よりポインタの学習

#6

投稿記事 by みけCAT » 8年前

解決したら、「解決チェック」をお願いします。
解決チェックをするには、投稿画面の「送信」ボタンの右側にある「解決!」にチェックを入れた状態で返信を投稿してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

strm
記事: 6
登録日時: 8年前

Re: 『やさしいC』よりポインタの学習

#7

投稿記事 by strm » 8年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る