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

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

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

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

Q&A

解決済

4回答

1135閲覧

sprintf関数で余計な変換指定子のためにwarningが出る場合

avantgarden

総合スコア121

PHP

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

0グッド

0クリップ

投稿2019/08/23 06:35

例えば

$name = '山田'; $before = '私は%dです。勝率は50%です。'; $after = sprintf($before, $name);

とすると、$beforeの「50%」のところの%が変換指定子とみなされて

Warning: sprintf(): Too few arguments in…

のワーニングが出てしまうと思うのですが、これを回避するにはどうすればいいのでしょうか?(簡単なことのような気はしますが…)

実施には、置き換え前の変数はHTMLの<head>タグ全体になっており、その中にscriptタグも入っており、そのscriptタグの中に%が複数あります。(25%、35%など)

置き換えたいのは<title>タグの中の一部だけです。

$head_before = ' <head> <title>%s</title> <script> $('').sclick({ centerPadding: "25%", }) <script> </head>'; $title='タイトル'; $head_after = sprintf($head_before, $title);

といった感じです。

$head_beforeの中身は色々省略して書いています。

よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/08/23 07:09

変換指定子、って言葉が出てくるくらいだから、ドキュメントを読んでいる気がするのですが、隅々までよく読んでみてください。大事なことが書いてありますよ。
kei344

2019/08/23 07:21

まだ質問が「受付中」になっていますが、「ベストアンサー」を選び「解決済」にされてはいかがでしょうか。
guest

回答4

0

これを回避するにはどうすればいいのでしょうか?

%%と書くと、%1つだけが出力されます。

投稿2019/08/23 06:38

maisumakun

総合スコア145183

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

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

avantgarden

2019/08/23 06:42

すいません。具体的にどういうことでしょうか…?
guest

0

php

1$before = '私は%dです。勝率は50%です。';

php

1$before = '私は%dです。勝率は50%%です。';

投稿2019/08/23 06:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

avantgarden

2019/08/23 06:59

ありがとうございます。いけました。 これはどういうことなのでしょうか…?
退会済みユーザー

退会済みユーザー

2019/08/23 07:10

maisumakun さんの回答の通りです
avantgarden

2019/08/23 07:15

ありがとうございます。
guest

0

ベストアンサー

PHP: sprintf - Manual
にある「例7 printf() のさまざまな例」のコメント行をよく読んでください。

%% に注目しましょう。これは、リテラル '%' を文字として出力します

投稿2019/08/23 07:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

avantgarden

2019/08/23 07:22

ありがとうございます。 printfやsprintfを使う場合は、%をリテラルで出力するには%%を書かないといけない、ということだと思いますが、これはこの関数特有の事情なのでしょうか?
退会済みユーザー

退会済みユーザー

2019/08/23 07:47

printf系関数はもともとこういうものです、としか言いようがないですね、参考にされたC言語での同名関数と同様の挙動にするために同じにしてあるというしか。
退会済みユーザー

退会済みユーザー

2019/08/23 08:27

ちなみにCで質問者のコードを実行すると セグメントフォルト・w・
avantgarden

2019/08/23 14:30

なるほどです。ドキュメントは隅々までチェックするべきですね…。 ありがとうございました。
guest

0

あとはこうするとか

PHP

1$name = '山田'; 2$before = '私は%sです。勝率は50&#37;です。'; 3$after = sprintf($before, $name); 4print $after;

投稿2019/08/23 07:06

yambejp

総合スコア114769

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

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

退会済みユーザー

退会済みユーザー

2019/08/23 07:08

大喜利会場じゃないよ
yambejp

2019/08/23 07:22

むしろ $name = '山田'; $before = '私は%sです。勝率は50%%です。<br>'; print $before; $after = sprintf($before, $name); print $after; より $name = '山田'; $before = '私は%sです。勝率は50&#37;です。<br>'; print $before; $after = sprintf($before, $name); print $after; の方がよりイメージがわきやすくないですか?
退会済みユーザー

退会済みユーザー

2019/08/23 08:31

むしろw sprintf("私は %s です。勝率は %s です", $name, $win_per . "%");
退会済みユーザー

退会済みユーザー

2019/08/23 08:39

むしろ、それ
avantgarden

2019/08/23 14:32

適当に書いた例なので、勝率は固定にしました。 って、そういう話じゃないですかね。。?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問