ページ 11

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

Posted: 2015年9月08日(火) 07:32
by strm
おはようございます。
質問をさせていただきます。

現在『やさしい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に到達しているロジックが分からず……。

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

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

Posted: 2015年9月08日(火) 07:41
by naohiro19

コード:

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

コード:

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

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

Posted: 2015年9月08日(火) 10:59
by strm
ありがとうございます。
ですが、申し訳ありません。
何がどうなってそうなるのか……。

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

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

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

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

Posted: 2015年9月08日(火) 11:35
by みけCAT
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.

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

Posted: 2015年9月08日(火) 13:15
by strm
ありがとうございます。疑問が氷解しました。
基礎部分をおざなりにして進んできたしまった証拠ですね。精進します。

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

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

Posted: 2015年9月08日(火) 14:22
by みけCAT
解決したら、「解決チェック」をお願いします。
解決チェックをするには、投稿画面の「送信」ボタンの右側にある「解決!」にチェックを入れた状態で返信を投稿してください。

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

Posted: 2015年9月09日(水) 04:04
by strm
承知いたしました。
ありがとうございます。