質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

979閲覧

sscanf のパターン解釈に関して その2

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2017/08/25 12:31

先の質問 sscanf のパターン解釈に関して からの派生質問です。

sscanf でパターンに関して下記サンプルの挙動が理解できませんでした。

$aは、whitespace まで読み取りその後を改めて解釈すると考えると、期待通り[1]に34が入っています。

$bを同様に考えると、[1]は4となりそうですが、実際はNULLです。

$cでスペースをパターンとして認識する事を確認したつもりでしたが、$dで2個めのスペースが認識されず、挙動がよく分からないものになります。

どのような仕組みで動作しているのでしょうか?
よろしくお願いいたします。

php

1$str = '123 34'; 2$n = sscanf($str,'%d%d',$a[0],$a[1]); 3$n = sscanf($str,'%d3%d',$b[0],$b[1]); 4$n = sscanf($str,'%d 3%d',$c[0],$c[1]); 5$n = sscanf($str,'%d 3 %d',$d[0],$d[1]); 6 7$a = array(2) { 8 [0]=> 9 int(123) 10 [1]=> 11 int(34) 12} 13$b = array(2) { 14 [0]=> 15 int(123) 16 [1]=> 17 NULL 18} 19$c = array(2) { 20 [0]=> 21 int(123) 22 [1]=> 23 int(4) 24} 25$d = array(2) { 26 [0]=> 27 int(123) 28 [1]=> 29 int(4) 30}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

2番目のケース:
最初に数字が読み取られ、読み取りポインタは空白を指します。そこから3を探すが無いので、この時点で終了。sscanfの戻り値は1です。$b[1]にはNULLが代入されるわけじゃなくてノータッチなので、元の値のままです。

4番目のケース:

$dで2個めのスペースが認識されず

書式指定の中の空白文字は、任意個数の空白文字にマッチします。つまりこの場合は0個の空白にマッチしています。

投稿2017/08/25 12:48

otn

総合スコア84487

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/25 22:06

回答、ありがとうございます。 2番目のケースで「そこから3を探すが無い」とあるのですが、34と続くので、「3が有る」認識です。ここがよく分かりません。もう少し、動作を教えていただけますか? 4番目のケースの説明だと[1]に 12、[2]に 34 でも良いように思えます。これはどのようにパターン解釈されているのでしょうか? 参照すべきドキュメントがあれば示していただけると助かります。
otn

2017/08/26 00:06

参考としては、PHPのドキュメントじゃ無いのですが、 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/scanf.3.html > 34と続くので、「3が有る」認識です。 ポインタの位置には空白があるので、3にマッチしません。 > 4番目のケースの説明だと[1]に 12、[2]に 34 でも良いように思えます。 パターンのマッチは先頭から最大に行われます。
退会済みユーザー

退会済みユーザー

2017/08/26 07:44

sscanf みたいな関数は PHP 以外のドキュメントも有用ですね。気が付きませんでした。 ドキュメントの読み込みがまだできていないので、よく確認してみます。 説明いただいた内容で、非常に理解が進みました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問