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

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

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

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

Q&A

解決済

1回答

286閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2017/08/25 08:27

sscanf のパターン解釈に関してマニュアルだと不十分なので、詳細の分かるドキュメントを探しています。

文字列を分割するのに非常に便利なので、最近使い始めたのですが、マニュアルの通りの動作をしません。

sscanf

関数 sscanf() は、printf() の入力版です。sscanf() は、文字列 str を読み込み、これを指定したフォーマット format に基づき解釈します。

これをさらっと読むと、sscanf() と printf() で同じパターンを使用すれば相互変換が可能に見えますが、実際の挙動は違います。
以下の確認用サンプルを動作させると、文字列を作るのに使用したパターンと同じパターンで処理しても、$u のように、元の配列とは異なる内容に分割されます。

なぜこうなったかは何となく分かるのですが、これを裏付けるドキュメントが探せません。

ご存知の方、教えていただけないでしょうか。
よろしくお願いいたします。

php

1<?php 2$str = [ 3 123, 4 'abc', 5 45, 6 67, 7 ]; 8$s = sprintf('%d%s%d %d',$str[0],$str[1],$str[2],$str[3]); 9// $s = '123abc45 67'; 10$n = sscanf($s,'%3d%3s%2d %2d',$t[0],$t[1],$t[2],$t[3]); 11var_dump($t); 12$n = sscanf($s,'%d%s%d %d',$u[0],$u[1],$u[2],$u[3]); 13var_dump($u); 14 15$tmp = '12 34'; 16$n = sscanf($tmp,'%d %d',$v[0],$v[1]); 17var_dump($v); 18$n = sscanf($tmp,'%1d %d',$w[0],$w[1]); 19var_dump($w);
$t = array(4) { [0]=> int(123) [1]=> string(3) "abc" [2]=> int(45) [3]=> int(67) } $u = array(4) { [0]=> int(123) [1]=> string(5) "abc45" [2]=> int(67) [3]=> NULL } $v = array(2) { [0]=> int(12) [1]=> int(34) } $w = array(2) { [0]=> int(1) [1]=> int(2) }

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

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

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

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

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

guest

回答1

0

ベストアンサー

「s stops reading at any whitespace character.」だから、
%sがwhitespaceが出現するまで文字列として認識できる部分を読み取ったから、
2個目のvar_dump()でabc45になっちゃったんじゃないですかね。

回避するには正規表現を使うしか無い!?

投稿2017/08/25 10:19

編集2017/08/25 10:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/08/25 11:10

回答ありがとうございます。 質問に書いた内容は、頂いた回答で説明出来ますね。 やっぱり PHP のマニュアルは優秀です。 「マニュアルの通りの動作をしません」なんて書くんじゃなかった^^; 少し新たな疑問が出てしまったので、追加の質問をするつもりです。 そちらも目を通していただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問