![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
大したことじゃないと言えばそうかもしれませんが、ちょっと氣になるんで質問させてください。
C言語でstrtokという函數ありますよね。
第1引數の文字列を、第2引數の文字列を構成する文字で區切る。
第2引數の文字を見つけたら、それを空文字('¥0')に置き換える。
字句の最初の文字へのポインタを返す。
このようなものだと理解しています。
次のプログラムを實行してみました。
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[]="XYZ1231ABC";
int i;
printf("%s\n", string);
putchar('\n');
printf("%s\n", strtok(string, "1A"));
printf("%s\n", strtok(NULL, "1A"));
printf("%s\n", strtok(NULL, "1A"));
printf("%s\n", strtok(NULL, "1A"));
putchar('\n');
for(i=0; i<=10; i++)
printf("string[%d]=%c\n", i, string[i]);
return 0;
}
結果
XYZ1231ABC
XYZ
23
BC
(null)
string[0]=X
string[1]=Y
string[2]=Z
string[3]=
string[4]=2
string[5]=3
string[6]=
string[7]=A
string[8]=B
string[9]=C
string[10]=
私が思うには、string[7]は空文字に置き換わってしまうはずだと思うんですが、
結果は'A'のままです。
ここが '¥0'に置き換わるかどうかは しょり系によって異なるのでしょうか。
No.1ベストアンサー
- 回答日時:
こんにちわ。
strtok 関数の動作についてですが、kmu_0031 さんの確認された結果で
全く問題ないと思います。
strtok は文字列を区切り文字で分割して、分割されたトークンのアドレス
を返すだけですので、連続した区切り文字を見つけた時に全てをNULL文字に
置き換えるかどうかについてはライブラリの実装に任されている筈です。
実装がライブラリに任されている場合、極力効率良く (処理が軽くなるように)
実装されている筈です。 (余計な事をして性能を劣化させないように)
今回の場合、string[7] にNULL文字をセットしても、しなくても3回目の
呼び出しで"BC" へのポインタを返していますので、strtok の処理としては
全く問題がないと言えます。
>strtok は文字列を区切り文字で分割して、分割されたトークンのアドレス
>を返すだけですので、連続した区切り文字を見つけた時に全てをNULL文字に
>置き換えるかどうかについてはライブラリの実装に任されている筈です。
おっしゃることわかります。私が質問したことはstrtokの本質とは關係なさそうですね。
ありがとうございました。
No.2
- 回答日時:
strtokは伝統的な(=Ritchie-C,Jhonson-C)C文字列ライブラリ(string)ではなく、White Smith-Cという方言色の強い処理系で実装されていた関数です。
White Smith-Cの独自関数はANSI-Cでほとんど駆逐されてしまったのですが、stringにstrtokやstrspnなどが残っています。
ってことで、strtokの挙動はPortable C Compiler(pcc)ライブラリから派生した他のANSI-Cライブラリ関数とは異質なことが多いようです。
(pccはポータビリティ確保のためトリッキーな内部処理を極力避けているため)
で実装ですが、「インターフェース仕様がANSI-Cに適合していれば内部処理に関しては実装依存でかまわない」というのが実情です。
その他にmemoryなどのライブラリも実装依存です。
mallocやstdioなんかはOS依存部分を多く含むため「内部処理の挙動を想定してはいけない」というのが一般的な見解でしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文字列が一致する行から...
-
C# List型のIndesOf メゾットに...
-
STL mapからの要素の削除
-
c#で(",")区切りのcsvファイル...
-
strncpy後のatoiがおかしい
-
ダブルクォーテーションのrepla...
-
IF関数でEmpty値を設定する方法。
-
ORA-01858: 数値を指定する箇所...
-
ダブルクォーテーションを含む...
-
JSPやサーブレットでSystem.out...
-
Javaコンパイルエラー
-
Path型をString型へ変換する(Java)
-
java.util.Comparatorのcompare...
-
java 一意の値を取り出す方法
-
java.util.Dateについて
-
並行サーバの導入
-
System.out.printlnの出力先
-
変数を動的に作るには?
-
javaで質問です。 文字列2023/2...
-
,で句切って部分一致をファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Java8以降】csvファイルの複...
-
特定の文字列が一致する行から...
-
マルチスレッドで同時にFTPアッ...
-
strcmp関数などでの複数の文字...
-
C# ListBoxのアイテムをユーザ...
-
「指定されたキャストは有効で...
-
string→CStringの型変換について
-
C#でIPアドレスの取得について
-
jap実行時のTomcatのエラーに困...
-
PHPのSHA256変換について
-
GridViewで複数のDropDownList...
-
C#での関数テーブルの作り方
-
Delphiで改行文字の置換がうま...
-
GDI+ DrawString() で指定範囲...
-
c#で(",")区切りのcsvファイル...
-
C# visual studio 2017 TCP/IP...
-
C#のStreamReaderでのforeach
-
strncpy後のatoiがおかしい
-
C# JSONについて
-
C#での関数テーブルの作り方
おすすめ情報