C
1#include <stdio.h>
2#include <string.h>
3
4int main(void)
5{
6 char str[] = "abcd?ef:ghi";
7 char *p;
8 p = strtok(str, "?:");
9 while(p) {
10 printf("[%s]\n", p);
11 p = strtok(NULL, "?:");
12 }
13}
実行結果
p = strtok(str, "?:");
strtok は、str の先頭から '?' または ':' を探します。
str[4] で '?' が見つかり、これを '\0' に書き換えます。
これにより文字列は "abcd" と "ef:ghi" に分割されました。
strtok の内部の静的なポインタ変数に "ef:ghi" の先頭アドレスを記憶します。
最後に "abcd" の先頭アドレスを呼び出し元に返します。
p は "abcd" を指すようになりました。
p は NULL ではないので、while (p) {
によりループの中に入ります。
そして、printf("[%s]\n", p);
で [abcd]
が表示されます。
p = strtok(NULL, "?:");
strtok は、第1引数が NULL なので、内部の静的なポインタ変数の指す文字列
"ef:ghi" の先頭から '?' または ':' を探します。
':' が見つかり、これを '\0' に書き換えます。
これにより文字列は "ef" と "ghi" に分割されました。
strtok の内部の静的なポインタ変数に "ghi" の先頭アドレスを記憶します。
最後に "ef" の先頭アドレスを呼び出し元に返します。
p は "ef" を指すようになりました。
p は NULL ではないので、while (p) {
によりループの中に入ります。
そして、printf("[%s]\n", p);
で [ef]
が表示されます。
p = strtok(NULL, "?:");
strtok は、第1引数が NULL なので、内部の静的なポインタ変数の指す文字列
"ghi" の先頭から '?' または ':' を探します。
'?' も ':' も見つからず、文字列の最後の '\0' に達しました。
strtok の内部の静的なポインタ変数を NULL にします。
最後に "ghi" の先頭アドレスを呼び出し元に返します。
p は "ghi" を指すようになりました。
p は NULL ではないので、while (p) {
によりループの中に入ります。
そして、printf("[%s]\n", p);
で [ghi]
が表示されます。
p = strtok(NULL, "?:");
strtok は、第1引数が NULL なので、内部の静的なポインタ変数を見ます。
それが NULL なので、もう '?' または ':' を探すことができません。
NULL を呼び出し元に返します。
p は NULL になりました。
p が NULL なので、 whileループは終了しました。
追記
strに入っている?:をpに代入する。
ポインタの理解が不十分です。
ポインタに文字列を代入することはできません。
ポインタに代入できるのはアドレスです。
char *p; p = "abc";
の場合、
文字列 "abc" の先頭の 'a' のアドレスが p に代入されます。
p は 'a' を指しますが、先頭だから "abc" を指すといってもいいでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/31 05:52
2021/01/31 06:00 編集
2021/01/31 08:38 編集
2021/01/31 08:26
2021/01/31 09:17
2021/01/31 09:58 編集