ページ 1 / 1
『やさしい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
承知いたしました。
ありがとうございます。