#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, ",."); } }
質問
const char* str = "abc:123\n,tdef:45,ghi:678.";とした場合、
\tは文字列にないのに結果が
[abc:123
,tdef:45,ghi:678.]
と改行された形になる理由がわかりません。
文字列に\tがあった場合に改行されるのではないですか?
また三つ目に関しても
[abc:123]
[tdef:45]
[ghi:678]
ではなく、
[abc:123
]
[tdef:45]
[ghi:678.]
と]が改行されている意味が分かりません。バグなどでしょうか?
質問2
もう一つ、同じような問題で理解が出来ないのですが
以下のプログラム
プログラム
の135行目から150行の
以下の部分について
文字列が
「今日は
晴れた 日です。」
と入力した場合、どのような文字列で出力されるのでしょうか?
またなぜwhile (n < 100 && words[n])のように書けるのでしょうか?
words[n] = strtok(buf, "\t\n"); while (n < 100 && words[n]) {//★★ここでもnが0から始まるのが、上での「タバコ」に続く品詞や改行が strtok(NULL, "\t\n"); //によりNULLになる。しかし、nが0の時の「タバコ」はwhileに入る前のwords[n] = strtok(buf, "\t\n");で //既にwords[n]に入っているため必要ない、なのでstrtok(NULL, "\t\n");のみしか書いていない。かつ、何周しても // 正しく単語がwords[++n]に入るように strtok(NULL, "\t\n");と // words[++n] = strtok(NULL, "\t\n");は同じ条件としている。 //二行目の「を」やその後に続く単語には品詞や改行が続くので、その部分をNULLにして words[++n] に単語を入れるために //words[++n] = strtok(NULL, "\t\n");は書いてある。 // strtok(NULL, "\t\n");//★一週目のwords[n] = strtok(buf, "\t\n")のためにこいつがあり、その後の二周目以降のwords[++n] = strtok(NULL, "\n"); }