
大したことじゃないと言えばそうかもしれませんが、ちょっと氣になるんで質問させてください。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- PHP 空文字 "" ですが 空文字の意味を教えてください。 3 2022/08/05 03:51
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
- 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# c言語 プログラムのエラー 1 2023/02/11 20:31
- Perl perlについての質問 2 2022/10/17 15:25
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でIPアドレスの取得について
-
C# JSONについて
-
System.out.printlnの意味がよ...
-
System.err. printlnとSystem.o...
-
JavaScriptの変数の値が消える!?
-
動的配列が存在(要素が有る)か...
-
大量のデータを読み込んで表示...
-
ループ処理の際、最後だけ","を...
-
【SQLServer接続のJSPの記述を...
-
シフトJISのエンコード
-
Request.formの値の初期化
-
Visual C++ でコントロールを...
-
JSPやサーブレットでSystem.out...
-
コンボボックスを使う時の警告
-
javaでカレンダー作成
-
flush()とclose()について
-
char型での演算子
-
JSPでの計算結果表示
-
オブジェクトの中のプロパティ...
-
セルの背景色の取得ができない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# ListBoxのアイテムをユーザ...
-
【Java8以降】csvファイルの複...
-
特定の文字列が一致する行から...
-
C#でIPアドレスの取得について
-
マルチスレッドで同時にFTPアッ...
-
Delphiで改行文字の置換がうま...
-
jap実行時のTomcatのエラーに困...
-
strcmp関数などでの複数の文字...
-
C# JSONについて
-
C#での関数テーブルの作り方
-
string→CStringの型変換について
-
「指定されたキャストは有効で...
-
C#のdelegateについて
-
C#のStreamReaderでのforeach
-
strtokでの空文字への置き換え
-
C++/CLI 関数がインポートでき...
-
GridViewで複数のDropDownList...
-
クラスの変換について
-
java HashMapで数値データを取...
-
決まった拡張子のファイルだけ...
おすすめ情報