dポイントプレゼントキャンペーン実施中!

#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, ",."); }
}

//puts("-- \"\t\"--");について、なぜ文字列に\tがないのに
//[abc:123]
//[, tdef:45, ghi : 678.]ではなく、
//[abc:123
//, tdef : 45, ghi : 678.]なのでしょうか?
また、strtok(NULL, ",."); }とは何をしているのでしょうか?文字列に",."は含まれていないのになぜこれが必要なのかわかりません。

A 回答 (4件)

●strtok(NULL,",.")ではなく、strtok(NULL,",")で良いのでは...


ご指摘のように","と指定した時、前述の3番めの表示は...

"ghi:678."
.......↑

と表示されると思われます。仰るような『良い』/『悪い』ではなく、プログラムの製作者は『delimに複数文字(",.")を指定すると、それぞれの文字が"個別に(","と"."として)"区切り記号として扱われますよ。』ということを見せたかったのではないでしょうか。
もちろん、プログラム作成の意図は作った人にしか判りませんので、ご質問者様が尚疑問に思われるのなら、ぜひ製作者に質問するべきでしょう。
    • good
    • 0

//puts("-- \"\t\"--");について、なぜ文字列に\tがないのに


//[abc:123]
//[, tdef:45, ghi : 678.]ではなく、
なぜ、このような出力を期待するのかがわかりませんけど・・・

printf("[%s]\n",str);
がどんな出力なのか、一度確かめられたら納得できると思います。

文字列に\tがないので、puts("-- \"\t\"--");では、printf("[%s]\n",str);が出力されますよね。
    • good
    • 0

実際にご提示のプログラムをコンパイル/実行しておりませんので誤りでしたらお許しください。



1.文字列に\tがないのに...なのでしょうか?
仰るとおり文字列...

const char* str = "abc:123\n,tdef:45,ghi:678.";

に文字'\t'は含まれておりませんので、ポインタpから参照される文字列はstrと完全に一致するはずです。つまり、文字列strは全く分解されることなくオリジナルのまま、一回でprintf()に渡されます。
ところで文字列strには文字'\n'が含まれますので、この文字により画面上では改行が起こります。

つまりこの例は「文字列に含まれない文字をdelimに指定しても、何も起こりませんよ。」を示しているのではないでしょうか。

2....trtok(NULL, ",."); }とは何をしているのでしょうか...
関数char *strtok(char *str, const char *delim);のマニュアルを参照すると、次の記述が見つかります。
『... したがって、例えば "aaa;;bbb," という文字列が与えられたとすると、 区切り文字列 ";," を指定した一連の strtok() の呼び出しでは、 "aaa" と bbb" が返り、その次にヌルポインターが返る。』とあります。

ご提示の例はこの説明を実際に示すためのものなのだと思われます。つまりご提示の例ではstrが分割されて”abc:123”、"tdef:45"、"ghi:678"の3つの文字列が表示されると予測します。

以上のようにご提示のプログラムはstrtok()関数の仕様を実際に確かめさせるものと思われますので、webなどで仕様を確認していただければご質問者様の疑問は簡単に解けるものと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
strtok(NULL,",.")ではなく、
strtok(NULL,",")で良いのではないでしょうか?なぜ、strtok(NULL,",.")としたのでしょうか?

お礼日時:2021/02/18 12:47

入っていなくても入っていることを想定してプログラムをするのは必要なことだと思います

    • good
    • 0

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