質問編集履歴

2 編集

carnage0216

carnage0216 score 130

2021/01/31 22:32  投稿

for文の動作について。
```
#include <stdio.h>
#include <string.h>
int main(void){
char str[] = "str == NULL ? \"(NULL)\" : str";
char *p, *q;
int ch;
p = str;
for(;;){
   for(q=p; !(*q=='?' || *q==':' || *q==0); q++) ;
   ch = *q;
   *q = 0;
   printf("|%s|\n", p);
   if(ch==0) break;
   p = q+1;
}
}
```
以上のプログラムについて
```
char str[] = "str == NULL ? \"(NULL)\" : str";
char *p, *q;
int ch;
p = str;
```
までの動作はわかるのですが、残りの部分の動作がいまいちわかりません。
どうか
```
for(;;){
   for(q=p; !(*q=='?' || *q==':' || *q==0); q++) ;
   ch = *q;
   *q = 0;
   printf("|%s|\n", p);
   if(ch==0) break;
   p = q+1;
}
}
```
自分なりの考え
**多分、for(q=p; !(*q=='?' || *q==':' || *q==0); q++) ;に関しては、
p(ポインタ)のアドレスをq(ポインタ)に代入して、qのアドレスに入った文字列に含まれる?や:や0を探すためにqのアドレスをq++より++していき一致した場合、chに代入して、qに0を代入、これを繰り返しと思うのですが、
p(ポインタ)のアドレスをq(ポインタ)に代入(箱に入れて)して、qのアドレスに入った文字列に含まれる?や:や0を探すためにqのアドレスをq++より++していき一致した場合、chに代入して、qに0を代入、これを繰り返しと思うのですが、
文字列[str == NULL][\"(NULL)\"][str"]はchに入っていると思ったのですが、なぜ printf("|%s|\n", ch);
ではなく、 printf("|%s|\n", p);なのでしょうか?
また if(ch==0) break;よりchに何も入らない(NULL)の後にp = q+1;とありますが、
これは何のための物でしょうか?**
の部分の動作を細かく教えて頂けないでしょうか?
kazuma-sさんのような解説が一番わかりやすいです。
  • C++

    8533 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    8999 questions

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

1 編集

carnage0216

carnage0216 score 130

2021/01/31 19:41  投稿

for文の動作について。
```
#include <stdio.h>
#include <string.h>
int main(void){
char str[] = "str == NULL ? \"(NULL)\" : str";
char *p, *q;
int ch;
p = str;
for(;;){
   for(q=p; !(*q=='?' || *q==':' || *q==0); q++) ;
   ch = *q;
   *q = 0;
   printf("|%s|\n", p);
   if(ch==0) break;
   p = q+1;
}
}
```
以上のプログラムについて
```
char str[] = "str == NULL ? \"(NULL)\" : str";
char *p, *q;
int ch;
p = str;
```
までの動作はわかるのですが、残りの部分の動作がいまいちわかりません。
どうか
```
for(;;){
   for(q=p; !(*q=='?' || *q==':' || *q==0); q++) ;
   ch = *q;
   *q = 0;
   printf("|%s|\n", p);
   if(ch==0) break;
   p = q+1;
}
}
```
自分なりの考え
**多分、for(q=p; !(*q=='?' || *q==':' || *q==0); q++) ;に関しては、
pのアドレスをqに代入して、qのアドレスに入った文字列に含まれる?や:や0を探すためにqのアドレスをq++より++していき一致した場合、chに代入して、qに0を代入、これを繰り返しと思うのですが、
p(ポインタ)のアドレスをq(ポインタ)に代入して、qのアドレスに入った文字列に含まれる?や:や0を探すためにqのアドレスをq++より++していき一致した場合、chに代入して、qに0を代入、これを繰り返しと思うのですが、
文字列[str == NULL][\"(NULL)\"][str"]はchに入っていると思ったのですが、なぜ printf("|%s|\n", ch);
ではなく、 printf("|%s|\n", p);なのでしょうか?
また if(ch==0) break;よりchに何も入らない(NULL)の後にp = q+1;とありますが、
これは何のための物でしょうか?**
の部分の動作を細かく教えて頂けないでしょうか?
kazuma-sさんのような解説が一番わかりやすいです。
  • C++

    8533 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    8999 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る