![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
#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, ",."); }とは何をしているのでしょうか?文字列に",."は含まれていないのになぜこれが必要なのかわかりません。
No.4ベストアンサー
- 回答日時:
●strtok(NULL,",.")ではなく、strtok(NULL,",")で良いのでは...
ご指摘のように","と指定した時、前述の3番めの表示は...
"ghi:678."
.......↑
と表示されると思われます。仰るような『良い』/『悪い』ではなく、プログラムの製作者は『delimに複数文字(",.")を指定すると、それぞれの文字が"個別に(","と"."として)"区切り記号として扱われますよ。』ということを見せたかったのではないでしょうか。
もちろん、プログラム作成の意図は作った人にしか判りませんので、ご質問者様が尚疑問に思われるのなら、ぜひ製作者に質問するべきでしょう。
No.3
- 回答日時:
//puts("-- \"\t\"--");について、なぜ文字列に\tがないのに
//[abc:123]
//[, tdef:45, ghi : 678.]ではなく、
なぜ、このような出力を期待するのかがわかりませんけど・・・
printf("[%s]\n",str);
がどんな出力なのか、一度確かめられたら納得できると思います。
文字列に\tがないので、puts("-- \"\t\"--");では、printf("[%s]\n",str);が出力されますよね。
No.2
- 回答日時:
実際にご提示のプログラムをコンパイル/実行しておりませんので誤りでしたらお許しください。
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などで仕様を確認していただければご質問者様の疑問は簡単に解けるものと思います。
ありがとうございます。
strtok(NULL,",.")ではなく、
strtok(NULL,",")で良いのではないでしょうか?なぜ、strtok(NULL,",.")としたのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
itoaわかりません
-
C言語 空白の行(改行のみ)が...
-
教えていただけませんか?C言語...
-
c言語のプログラミングでキーボ...
-
C言語の課題です
-
文字列の途中に「0」がある場...
-
fgetsで拾われる改行文字を削除...
-
トークン
-
CStringについて
-
16進数の文字列
-
文字列入れ替えのプログラムに...
-
ファイル入出力
-
大文字の文字列→小文字の文字列
-
Cで「大文字、小文字の判定」は...
-
”123456”といった整数を文字列...
-
ブランクのチェック
-
関数の作り方
-
C言語の初心者です。これを実行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
strstrを利用しない文字列検索...
-
C言語 空白の行(改行のみ)が...
-
fgetsで拾われる改行文字を削除...
-
文字列中に含まれる文字の個数...
-
C言語で16進数文字列から16進数...
-
itoaわかりません
-
文の意味
-
C言語 strlen 再入力を促す
-
fgetsでバッファ残留文字列を無...
-
全角文字のチェック
-
C++
-
ブランクのチェック
-
C言語、単語ごとに改行したい
おすすめ情報