C言語なら俺に聞け 155 at TECH
[2ch|▼Menu]
841:デフォルトの名無しさん
20/08/22 10:09:37.81 K3IJhML30.net
>>401
> 何に使うかでそんなに変わるか?
亀レスでごめんなさい。
GUIを含むかどうかでちょと変わると思う。
WindowsならやはりVisualStuidoが便利だった。
Linux、UNIXならgcc,vi,makeの3種の神器かな?

842:デフォルトの名無しさん
20/08/25 11:52:50.75 c6c4SV8K0.net
for文の制御式にポインタが単独で使われているコードの意味が分かりません。
URLリンク(git.musl-libc.org)
ここにある
const char *path, *p, *z;
path = getenv("NLSPATH");
for (p=path; *p; p=z) { // ← これ
...
}
こんな処理です。
繰り返しの際に実行する式にポインタを置くことで
どういう処理が行なわれているのか解説していただけないでしょうか。
どうかよろしくおねがいします。

843:デフォルトの名無しさん
20/08/25 11:57:23.18 Zt9gBA2MF.net
*p なら文字終端 '\0' チェックしてるだけじゃね
for (p=path; *p != '\0'; p=z) {
と一緒

844:デフォルトの名無しさん (ワッチョイ 1fbb-n+O8)
20/08/25 12:06:04 IYsRryaL0.net
p=zの方が気になる

845:842
20/08/25 12:36:19.71 c6c4SV8K0.net
>>843
なるほど!
for文の中でpを:ごとに削っていっているので,
それが空になるまで廻すという意味になるんですね。
*p != '\0'はメッチャ分かり易い書き換えでした!
(*pとだけ書いてあっても難なく読めるようにならないと
いけないとは自覚していますが……)
>>844
すいません,ほぼ追加で質問する形になってしまうのですが,
どういうところが気になりますか?
教えていただけると勉強になります。

846:デフォルトの名無しさん
20/08/25 12:36:38.95 N6/CJWHL0.net
>>842
*p は、その位置の文字が '¥0' じゃなければループ内に入る判定。
ようするに文字列の終端にたどり着くまでループするということ。
p=z の z は、ループ内で p から見た文字列の中の ':' がある位置の次が入るようになってる。
ようするに path を ':' 区切りにした断片を一つずつ処理してる。

847:デフォルトの名無しさん
20/08/25 12:44:35.72 mY7DCxIU0.net
>>844
z = __strchrnul(p, ':'); で ':' 毎に切り出して処理して、次の項目に移動してるんでしょ

848:デフォルトの名無しさん
20/08/25 12:48:06.50 lcyhmMWC0.net
strtok : ぼくの出番は・・・

849:デフォルトの名無しさん
20/08/25 12:55:51.83 ch0Vj7Ea0.net
こういう2重ループは生理的に好きになれないw

850:デフォルトの名無しさん
20/08/25 13:24:37.63 c6c4SV8K0.net
>>848
たしかになぜstrtok()ではなくて独自関数を使うか気になりますね。
__strchrnul()はここで定義されていますが,
URLリンク(git.musl-libc.org)
strtok()の仕様
URLリンク(pubs.opengroup.org)
を見ても,ほとんどインターフェースも同じに思えます。
(引数の型がちょっと違う?)
strtok()関数自体を実装しているならともかく
外部から使用するのにわざわざstrtok()と仕様がそっくりな
独自の関数を用いる理由が分からないですね。

851:デフォルトの名無しさん
20/08/25 14:01:32.20 mY7DCxIU0.net
>>850
> たしかになぜstrtok()ではなくて独自関数を使うか気になりますね。
strtok( ) は与えられた文字列書き換えちゃうし内部状態を持つので今どき使うのはやめた方がいいと思うぞ

852:デフォルトの名無しさん
20/08/25 15:02:43.34 DOmxfygr0.net
再入可能じゃないからね

853:デフォルトの名無しさん
20/08/25 15:06:17.67 fzTrphgL0.net
既存関数を使えばわざわざ文字列をループで処理する必要は無いと思えるけど
例えば昔から良くあるコマンドライン引数をチェックする場合などは
ループで処理するのが一般的かなと思われる
簡単なコードを書いてみたので確認してみるといいかも
URLリンク(paiza.io)

854:デフォルトの名無しさん
20/08/25 15:08:24.49 DOmxfygr0.net
コマンドライン引数にstrtokは全く向かない
引用符使われただけでアウト
ASCIIコードしか想定していない

855:デフォルトの名無しさん
20/08/25 15:38:28.41 c6c4SV8K0.net
>>851
ありがとうございます。
なるほど,
URLリンク(www.jpcert.or.jp)
にも strtok() を不用意に扱わないようにという記述がありました。
だからわざわざ,strtok()に似ているが与件文字列を変更しない
っていう内部関数を利用していたんですね。
「区切り文字による分割」みたいな処理をする場合は,
strtok()の挙動を完全に理解した上で使うか,
自分で挙動を把握できる内部関数を作るかにするよう心掛けます。
(自分で1からC言語を書けるようになるのは
当分先のことになるとは思いますが)

856:デフォルトの名無しさん
20/08/25 18:08:51.59 efL3nra7M.net
ライブラリ関数内部で同じライブラリで公開してる別の関数を呼び出すのはエラー時に滅茶苦茶になりそうだから良くない

857:デフォルトの名無しさん
20/08/25 19:42:36.86 KqJVwSUy0.net
へぇ __strchrnul だと非マッチ時 zがヌルポにならないようになってんのか

858:デフォルトの名無しさん
20/08/26 07:47:13.52 EcgUuw1J0.net
文字列はS-JISのこと考えて自分で作るか
逆にunicodeで全部ライブラリに任せるかしてるわ。

859:デフォルトの名無しさん (ワッチョイ a5bb-xiBb)
20/08/26 07:57:09 68jGS2+/0.net
こないだユニコード文字列を扱うライブラリを作ったんだが、Poweshellから使うとうまく動作しないでやんの
Bashだとうまくいくからシェルの文字コードが原因かなぁって

860:デフォルトの名無しさん
20/08/28 14:09:17.18 Rsi3PU970.net
Poweshell 相手 なら UTF16で試してみて

861:デフォルトの名無しさん
20/08/29 18:11:22.84 uw2IISYA0.net
>>860
サンクス
覚えておく


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

1337日前に更新/207 KB
担当:undef