公式アカウントからの投稿が始まります

#pragma warning(disable: 4996)
#include <stdio.h>// puts, printf
#include <string.h>// strcpy, strtok


int main()
{
const char* str = "abc:123\n,tdef:45,ghi:678.";
char buf[1024], * p;

strcpy(buf, str);
puts("-- \"\\n\"--");
p = strtok(buf, "\n");
while (p) { printf("[%s]\n", p); p = strtok(NULL, "\n"); }

strcpy(buf, str);
puts("-- \"\t\"--");
p = strtok(buf, "\t");
while (p) { printf("[%s]\n", p); p = strtok(NULL, "\t"); }

strcpy(buf, str);
puts("-- \",\"--");
p = strtok(buf, ",");
while (p) { printf("[%s]\n", p); p = strtok(NULL, ","); }

strcpy(buf, str);
puts("-- \",\\t\\n\"--");
p = strtok(buf, ",\t\n");
while (p) { printf("[%s]\n", p); p = strtok(NULL, ",."); }
}




について、なぜ
二つ目の出力は/tがないのに
[abc:123]
[,tdef:45,ghi:678.]
ではなく、
[abc:123
,tdef:45,ghi:678.]
なのですか?

もう一つ、三つ目の出力はなぜ
[abc:123]
[tdef:45]
[ghi:678]
ではなく
[abc:123
]
[tdef:45]
[ghi:678.]
なのでしょうか?
どうかわかりやすく教えてください。

A 回答 (2件)

二つ目の出力について


strtokは指定された文字(この場合は\tを区切り文字にして)strを
分割した結果を返します。strの中には、\tはないので、そのまま、strの内容がそっくりpに返ります。
そうすると、
printf("[%s]\n", p)は
printf("[%s]\n", str)と同じことです。
strの中に\nがあるので、strを印字するとそこで改行されます。
その為、
[abc:123
,tdef:45,ghi:678.]
となります。

三つ目の出力について
こちらで実行すると、以下のようになりました。
あなたの想定通りです。もう一度、あなたが提示したソースを
コンパイル&実行して確認してみてください。
-- ",\t\n"--
[abc:123]
[tdef:45]
[ghi:678]

なお、三つ目の出力の区切り文字ですが、
p = strtok(buf, ",\t\n");・・・・①
while (p) { printf("[%s]\n", p); p = strtok(NULL, ",."); }・・・②
①ではタブ又は改行
②では、カンマ又はピリオド
になってますが、これは意図的に行われたものですね。
    • good
    • 0

strtok の動作は理解できているのですか?

    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!