1 :
ニュー速代表:
ケータイWatchの記事によりますと、auのW42CAおよびW42Hに特定の文字列を入力・表示すると
強制再起動してしまうバグが発見されたとのこと(写真はタフ携帯G'zOneことW42CA)。
問題が発生するのはメールの入力または受信メールの表示時。
肝心の「特定の文字列」とは「%n」および「%S」……
と書いただけで原因を推測できる人にとってはキーボードや枕に顔を埋めて脚をじたばたさせたくなるほど
恥ずかしい悶絶もののバグですが、KDDIとしては「発生する条件が限定的であるため」修正はせず、
ユーザへの告知もおこなわないとのこと。
(なぜこれがものすごく恥ずかしい(と推測される)のか分からない人はプログラミング知識のある人に聞いてみましょう)。
%nと%Sそのものだけでなく%とnのあいだに0〜255の数字や+ , -がある場合も発動するとあり、メールで
ありふれたURLを送ったり受信するだけで飛ばせます。
この件についてW42CA / W42Hのユーザにメールしただけで再起動。
「気になるユーザに対しては」店頭預かり修理、今後販売されるものについては順次回収という対応を
採るようですが、ここまで恥ずかしいといっそ隠すより告知だけはしておいたほうがダメージは少ないのでは
ないでしょうか。
ソース
ttp://japanese.engadget.com/2006/08/04/au-w42ca-w42h/ このスレで頭を悩ます子羊達に教えてやってくれ
http://news20.2ch.net/test/read.cgi/news/1154694656/
だからリテラルを直接渡さずに
"%s",str
にしろとあれほど
レビューやってないか、会社全体のレベルが低いのか。
大手の携帯ってったって、機能の中には零細企業が細々と下請けして
書いてるところもあるからね。
まじで、いるんだよ。
printf("hogehoge\n") ;
なんていうコードを平気な顔して書く香具師が。
恐ろしいことに、初級者向けのC言語の教科書にも、
そういうのが平然と書かれている。もうね、アホかと。
8 :
デフォルトの名無しさん:2006/08/05(土) 04:16:29
馬鹿にも分かるように説明してくれ
printf("%s");
何が出るかな〜何が出るかな〜
>>8 char buf[] = "foo%sbar";
printf(buf);
メールの文を書式文字列として扱ったってことか。
どんな糞プログラムなのか、ソースを見てみたいw
何が恥ずかしいって、かなりの初心者でも何が原因なのか特定できてしまうことだな
>11のような恥ずかしさだな
>>15 >>9がなぜ恥ずかしいかわかってないみたいだな。
ちなみに今回は"%s"は問題なかった。
わかってないならいい。
>>17 わかってるよ。
"%S"と"%n"に問題があったから「ああ、あれか」と"%s"を持ち出すようなアホということだ。
つまり、字面だけみてうっかり煽っちゃったって事だな。
ごくろうさん。
>>4 レビューの問題じゃなくて、テストの問題だろ。
レビューでバグが100%なくなるとでも思ってるのか?
23 :
デフォルトの名無しさん:2006/08/05(土) 15:50:10
>>1にある元のスレッドで真面目に解説してる人がいる。
興味があったらどぞ。
なぜスラドを勧めないのか
printf の %n てどういう時使うの?
メモリへの不正アクセスがあると天国へ上る仕様なのかな。
printfじゃ破壊は起こらないし。いや、カキコみ先のバッファがあふれたのか?
30 :
デフォルトの名無しさん:2006/08/05(土) 17:59:05
>>22 あほか。
テストで全部の問題を洗い出せると思ってるのか。
31 :
デフォルトの名無しさん:2006/08/05(土) 18:46:14
>>30 否定だけして代案を出さないやつのことってどう思う?
知的障害者
テストで全部の問題を洗い出せるわけではないが、おおよそ想像のつく問題
は洗い出せる。
で、これは、テストで洗い出せる類の問題ではある。でなければテスト仕様
を書いたやつか、テストしたやつの怠慢。
レビューが好きな奴は、無限の時間を使って、机上でレビューし続ければいいと思うよ
>>30 レビューで全ての問題を洗い出せるなら、テスト工程はいらないんじゃないかな。
こんな有名な落とし穴は、レビューの段階で発見されてるべきだろ。
テスト段階で初めて発見されるって、まともなレビュアーがいない証拠。
いいからさっさと理由教えろよ。
自分以外の、いるかどうかもわからないどこかの馬鹿をたたき続けるキチガイうぜえ
なんだか、世の中のソフトウェアの大部分がセキュアで高品質なものだと
勘違いしてる奴がいるな。
42 :
デフォルトの名無しさん:2006/08/05(土) 21:40:23
>>22 テストで100%バグを発見できるとでも思ってるのか?
まずはレビューして、アホなプログラマを矯正するのが先。
放置しておくと、腐ったコードを大量生産しやがるから。
45 :
6:2006/08/05(土) 23:01:29
なぜダメなのか、わからない人が多いようなので説明しますよ。
printf("hogehoge\n") ;
なんてのを日常的に書いていると、
printf("100%search done.\n") ;
や
printf(strSomeThing) ;
なんていうのをうっかり書いてしまうから。
あくまでもprintfの第一引数は書式文字列だということを忘れないために、
printf("hogehoge\n") ;
といったprintfの使い方は禁じ手としておくべきなんです。
最初にコードを書いた人間が気をつけていてミスしていなくても、
アホな誰かが文字列だけ書き換えてダメにしてしまう恐れもあるしね。
>>45 printf("\n");もダメと言いたいのかな?
ifは if(p == 0)じゃなく、if(0 == p)と書かないとダメなんです。
なぜダメなのか、わからない人が多いようなので説明しますよ。
if(p == 0)
なんてのを日常的に書いていると、
if(p = 0)
なんていうのをうっかり書いてしまうから。
あくまでもifの基本は条件式だということを忘れないために、
if(p == 0)
といったifの使い方は禁じ手としておくべきなんです。
最初にコードを書いた人間が気をつけていてミスしていなくても、
アホな誰かが文字列だけ書き換えてダメにしてしまう恐れもあるしね。
>>46 矛盾点がありまくる時点でネタ決定。
面白くないネタにマジレスはイクナイ。
まじで、いるんだよ。
if(p == 0) ;
なんていうコードを平気な顔して書く香具師が。
恐ろしいことに、初級者向けのC言語の教科書にも、
そういうのが平然と書かれている。もうね、アホかと。
引数なし main は int main() じゃなく、int main(void)と書かないとダメなんです。
なぜダメなのか、わからない人が多いようなので説明しますよ。
int main()
なんてのを日常的に書いていると、
int mail()
なんていうのをうっかり書いてしまうから。
あくまでもmainの引数なしはvoidだということを忘れないために、
int main( /* void */ )
といったmailの使い方は禁じ手としておくべきなんです。
最初にコードを書いた人間が気をつけていてtypoしていなくても、
アホな誰かが文字列だけ書き換えてダメにしてしまう恐れもあるしね。
まじで、いるんだよ。
mail()
なんていうtypoを平気な顔して書く香具師が。
恐ろしいことに、初級者向けのC言語の教科書にも、
そういう誤植が平然と書かれている。でもね、typoはしょうがないよ。
なぜダメなのか、わからない人が多いようなので説明しますよ。
a[0]=++n;
なんてのを日常的に書いていると、
a[n]=++n;
や
a+++n=n ;
なんていうのをうっかり書いてしまうから。
あくまでも副作用完了点までの間に値を変更する回数は一度だけってことを忘れないために、
++n
といった演算子の使い方は禁じ手としておくべきなんです。
書き込む前に既に反省している。
反省してるように見えません。
もう一度お願いします。
お題はcharで。
charポインタは char* p じゃなく、char *pと書かないとダメなんです。
なぜダメなのか、わからない人が多いようなので説明しますよ。
char* p
なんてのを日常的に書いていると、
const char* p
なんていうのをうっかり書いてしまうから。
あくまでもcharポインタからのデータ破壊をさせないことを忘れないために、
char* p
といった変数宣言の使い方は禁じ手としておくべきなんです。
アホな誰かが文字列を書き換ようとしてダメにしてしまう恐れもあるしね。
char* p, pp;
なんていうのもありがちだしな。
>>55 意識したことなんだが、これってpだけポインタ?
そう、ppもポインタにしたければ
char *p, *pp;
>>50 違う。
C言語の規格で、main()の引数は void もしくは int, char** って決まってる。
そして、C言語で関数の引数宣言を省略したとき、その関数は「void」(引数無し)ではなく
「...」(可変長引数)となる。
>>47はコンパイラのWarning見なかったり、普段から条件式に副作用のある式を入れる人?
(0 == p) よりも (p == 0) の方が、左から右に、ストレートに読めるじゃん。
「0がpの時」って書きたいんじゃなくて、「pが0の時」って書きたい場合、(p == 0) の方が
綺麗な書き方。
C#でSystem.Console.WriteLine(str) を WriteLine("{0}", str)
と書かないとバグを生むと力説してた人がいたのを思い出した。
>>59 もちろん(0==p)とするメリットをわかってる上で言ってるよな?
>>6はうまいこと自分の勘違いをスタイルの問題とか泥沼な話題にそらしたな
いやでも実際
>>6で言ってるような奴が
今回のような間抜けなバグを仕込んでるんじゃないの?w
>>64 printf 使うのがそんなにおかしいか?
まあこの場合は puts だろうが、
改行なしの文字列の出力の場合はどうするんだ?
>>65 君に便利な標準関数を教えてあげよう。
fputs
>>66 ああ、そうだ…その手があった。
標準出力にfputs使うなんて考えもしなかった。
結構だめだな。おれ。
>>65 いや単純に
>>6みたいな書き方がおかしいってことじゃなくて、
void hoge( const char* user_input ) {
printf( user_input );
}
みたいな書き方を普通にしてそうだってこと。
んで
>>1のバグもそういう奴が仕込んだのでは、と。
それは既に
>>1の記事で明らかなことじゃまいか
無理矢理
>>6に関連付けるとかどうよ?
>>69 安易にバグを決め付けるような示唆をしてる
>>1の記事書いたやつは素人だよ。
s,f,printf かどうかもわからないのに。
いや別に無理矢理なつもりはなかったんだが・・・
ただ漏れは
>>1のようなバグコードは
どういう奴が書きそうかってことを言いたかっただけね。
>>61 副作用の意味がわかってない人
>>72 C Prog FAQ 読んでその気になってる人
>>72 んなもん拾ってくるより自分で説明した方が早いだろ?
早いけど、特に2chでは適当なソースを貼った方がいい
>>59 アホ。明らかに皮肉って書いてるだろがボケが。
全体を読んでレスれよ。断片的に読んで噛み付いてくんなカス。
>>45 > printf("100%search done.\n") ;
これはデフォルトで警告を出したり、警告レベルを上げておくと警告
してくれるコンパイラがほとんどですね。
> printf(strSomeThing) ;
> なんていうのをうっかり書いてしまうから。
飛躍しすぎでしょう。
アホにマジギレ乙
マジレスにはマジギレが基本だろ
80 :
61:2006/08/06(日) 01:34:07
>>73 何で俺は「副作用の意味がわかってない人」なんだ?そのこと自体がマジメにわからん
今後のためにもよかったら教えてくれ
いや、アホはスルーが基本
質問に質問で返したよコイツ。
国語の成績1だな
>>80 普段からコンパイラのWarningを見ない人か、条件式に副作用のある式を書く人じゃなければ、
0==pとは書かないだろうと
>>59が言ったのに対して、
>もちろん(0==p)とするメリットをわかってる上で言ってるよな?
と、見当違いなレスを返しているため。
マジで言ってるのか?
おれが見る限り、
>>59の前提を取り入れると
>>61の確認は意味がないって言ってるんだが。
それともコンパイル時に警告吐かせないようにしてるのか?
86 :
85:2006/08/06(日) 01:44:39
マジで言ってるのか?
おれが見る限り、質問に質問で返したら
国語の成績は意味がないって言ってるんだが。
それとも学生時にテスト受けないようにしてるのか?
>>83!=80=87に大尉してです。
基地外はスルーで。
>>87 ワロタ。
まあ、間違ったからってそう必死になるな。
これ以上は何も書き込まないほうがいいぞ。
またアホが1人来た。
このスレでキチガイをスルーするくらいなら、
そもそもこのスレに来る必要が無いことくらい理解しとけ。
>>89 はぁ?理解出来なかったのか?
国語の成績マジで1だなぁ。
元々 p==0 派だったけど、0==p 派に改宗した俺からすれば
0==p 派が言ってるのは「言い訳」レベルで「正当な理由」足り得ない。
Warningだって常にコンパイラが出してくれる保証なんてどこにもない
(複雑な構文になってる場合や特定の条件が揃うとWarningとして扱われ
ないなんてことも十分考えられる)し、「普段から条件式に副作用の
ある式を入れる人?」ってのはそもそも論点がずれてる。
>>92 学歴コンプレックスをお持ちとは、
なかなかいい趣味をしてますな。
どうです?専門板で一緒に憂さ晴らしでも?
95 :
デフォルトの名無しさん:2006/08/06(日) 01:59:18
つ おい何が恥ずかしいんだコノスレ
このスレに居ることが恥ずかしいんだよボク
97 :
93:2006/08/06(日) 02:01:32
×0==p 派が言ってるのは「言い訳」レベルで「正当な理由」足り得ない。
○p==0 派が言ってるのは「言い訳」レベルで「正当な理由」足り得ない。
間違えたああ orz
99 :
61:2006/08/06(日) 02:03:19
流れに乗り遅れてしまったorz
>>82 安直にレスしてしまったなあと後悔してる
けど
>>84の言う
「条件式に副作用のある式を書く人じゃなければ、0==pとは書かないだろう」
の意味が素直にわからない
ちなみに
>>83=
>>87は俺じゃない
>>93 まあ、君みたいに閉じ括弧を書き忘れるような注意力散漫な子は、
0==pと書いておけばいいんじゃね?
>>93 勝手に解釈するが、二個目の 0==p は p==0 だよな?
意味不明な主観を前提を持ち出すならば、その前提に反論する。
構文解析の木を作る段階でコンディションの中に代入が含まれてる時点で
警告出すコンパイラのほうが多いだろ。自分でその実装を考えてみろ。
>>99 普段、条件式に副作用のある式を書く人は、p=0にコンパイラが警告を出さないか、
出したとしても無視する癖がついてるだろうから。
つまり、普段コンパイラのWarningを見る人か、条件式に副作用のある式を書かない人は、
0==pと書く必要がない。
>>99 例出すよ。
if( fp = fopen(ほげ) )
副作用: fp に fopen が代入される
その後、isTrue(fp) として条件分岐
副作用のある式とか言ってるからだろ。
関数にだって副作用があるが、書いても警告は出ない。
ちゃんと代入式を書く人は、と言えアホ
107 :
61:2006/08/06(日) 02:13:02
>>104がくそこーどに見えない俺はどうみても経験不足です
アホな学生につきあっていただきありがとうございました
108 :
104:2006/08/06(日) 02:14:58
orz
s/fopen /fopen()の結果/
それと擬似コードでうざくてすまん。
他にも代入の副作用なら関数内の引数とかもある。
そのレスは、副作用のある式とか書いちゃったアホの言い訳?
>>110 これだけ「副作用」でわかってるやつが多いってのに、
いちいち「適切でない」なんて否定してたら現実社会やってけねーぞ。
適切な書き方も出来ない奴が
「副作用の意味がわかってない人」
とかレスしてたんでからかってるだけw
間違いは素直にみとめましょう
>>107 普通は
if ((fp = fopen()) == NULL) {}
と書く。なぜならそう書けば、コンパイラが警告を出さないから。
>>112 いちいちお前定義の「副作用」をここでお披露目してなんの意味があるんだ?
空気嫁。
>条件式に副作用のある式を書かない人
だからそれは関係ねぇだろ、== が typo で = となった時の問題なんだから。
117 :
104:2006/08/06(日) 02:25:20
普通は
if(File* fp = fopen())
と書く。
120 :
61:2006/08/06(日) 02:26:22
>>107 ああ、そういう意味ですか
てっきり副作用のある条件式ってなだけでくそこーどなのかと思った
まあ今までは「副作用のある条件式を使うのは常識」と考えてたので、
>>61=
>>80=
>>99=
>>107はこのスレの流れに若干混乱気味だったとお思いください
>>115 適切な書き方も出来ないから国語が1なんだよ。
教科書嫁
123 :
デフォルトの名無しさん:2006/08/06(日) 02:27:30
Cにbool型を導入してintとの暗黙の型変換を禁止してしまわないとこの論争は永遠に続きそう。
>>1の話に戻すが、%S %n 以外の %s %d などは問題ないようにも読めるけどどういうケースが考えられるのかな。
>>116 普段条件式に副作用のある式を書かない人は、そのtypoをコンパイラが警告してくれるので、
すぐに間違いに気づく。
>>101 C++の場合、構文上代入に見えてもそれが本当に代入を意味するかどうかが
コンパイル中にはわかるとは限らないんだけど。
>>126 少なくとも昔のCなら通らんだろ。C99なら通るんだっけ?
句点つけたりつけなかったりの奴が国語がどうたら言ってはいけない。
>>123 >
>>1の話に戻すが、%S %n 以外の %s %d などは問題ないようにも読めるけどどういうケースが考えられるのかな。
実際に問題がなかった。
事前に文字列をパースして変換する処理はしてたんだけど、
マイナーな%S, %nが抜けたのではないかという見方がある。
>>128 句点無いと理解に支障がでるのか?
だから国語が1なんだよ。
>>121 何でおれがお前定義の言語で構成された報告書を出さねばならんのだ。
日本語はプログラムじゃないぞ?
解釈する人は多数いるんだから「適切」という言葉自体がどういう意味にでもなる。
それと国語のテストは解釈の問題の方が多くないか?
言葉の定義を書けなんて問題は聞いた事ないな。
どっちかがやめるまでこの争いは終わらんかもわからんね
>>130 おk、今度は入れたねw
つーか俺小学生のときに作文で句点入れ忘れて
減点されたことあんのよ。
この争いは、このスレの副作用なのでしょうがない。
関数型スレッドにしよう
>>47は単なるネタかと思ったが、本気でそう主張したかったとは思いもよらなかった。
最近自分で見つけたテクニックで、人に言わずにいられなかったんだろうか。
>>134 はいはい、もともと成績1なんだから、減点されても1だろうが
>>129 http://plusd.itmedia.co.jp/mobile/articles/0608/03/news081.html >具体的には、メールの本文に「%n」「%S」と入力すると、
>端末が再起動するというもの。
>%とn、%とSの間に0から255ケタまでの半角数字や
>+、-、 #、.などの記号、半角スペースが入る場合にも
>端末が再起動する。
>
>なお、両端末で受信したメールの本文に
>上記の文字列が入っている場合にも再起動するため、
>メールを送信する側も注意が必要だ。
>
'%' をエスケープさせるなら '%' -> '%%' の変換処理を前もってすればいいだけでそ?
変換処理がないなら、"%s" でも再現性あるはずだから報告あるはずだし、
%n と %S に独自の実装があったんでない?
141 :
61:2006/08/06(日) 02:42:04
>>137 いや、ネタなんだろうけど全ては61の勘違いでこの流れに・・・
なんだかよくわからん展開になって参りました
ま、今日一番勢いがあるスレになって
最終的にはよかったんじゃないかな?
わざわざ不毛な議論を展開したこのスレに乾杯。
const char *p;
char const *p;
char * const p;
const char const *p;
const char * const p;
>>77 そういうコードを見たことがあるから飛躍しすぎとも言えない。
まぁその人はうっかりって言うより
printf関数とかの引数の意味を理解してなかっただけなんだけども。
入門書で扱うのは行き過ぎな気もするが、
こういう問題が出てる以上はきちんと説明した方がいいのかもしれない。
>>145 >char * const p;
>const char * const p;
これいけるの?
>>146 結論:新米には一度 printf を作らせる
>>146 printf(変数)と書くと問題がある場合があるから、printf(文字列リテラル)も禁止するというのはやりすぎでは?
こーいうこと言うヤシに限って、コンパイラのwarningは英語で読めないとかのたまうから困る
>>148 いや禁止にするとかじゃなくて
危険性を理解させること。
153 :
デフォルトの名無しさん:2006/08/06(日) 03:14:53
overloadが使えるとして、printf(const char *str) と printf(const char *fmt, ...) に別の処理をふったら解決なんだろうけどね。
諸悪の根源は puts が勝手に改行するという謎仕様。
この改行があるがために、単なる文字列リテラルを標準出力するのにprintfを使ってしまうという事実。
まあ、いちいち解析処理のある関数使うよりは
そのまま stdout に出力したほうがいいだろう。
>>151 自分は賛同しない方。
printf(文字列リテラル)は普通に使うし。
#define print(x) fputs(stdout,(x))
まぁでもいい機会だから、これを機にfputsを使うようにしようっと。
>>159 ってか、文字列リテラルで可変にしたいなら
print( "Line 1\n" "Line 2" )
ってやりゃよくね?
161 :
デフォルトの名無しさん:2006/08/06(日) 03:30:26
C言語がクソってことだね♪
164 :
163:2006/08/06(日) 03:34:54
ごめん
#define printf
と見間違えてた。吊ってくる。
>>146 printfの注意事項を書かずとも、せめて「お手本」のコードを、なんとかしろ、と。
>>148 > printf(文字列リテラル) ;
これはvsprintfの処理が入るだけ無駄だろ。
170 :
157:2006/08/06(日) 11:48:06
>>169 その通りでした
int fputs(const char *s, FILE *stream);
いいから早く
>>1のどこが恥ずかしいのか教えろよ。
気になって昼飯も喉を通らないだろ
夏バテじゃないかな
そもそも出力用の関数のくせにメモリに書き込む機能があるのが
あのさぁ、printfに文字列リテラル書くのって別に危なくないだろ?
リテラルは内容がわかって書いているんだから、それで
>>1のようなアグだすのはよっぽどアホ。
危険なのははリテラルではなく、「文字列変数」を突っ込む場合だろ?
×アグ
○バグ
そうだよね。
printf("100%search done.\n");
とか全然問題ないよね。
警告レベル上げとけばいいじゃない
羹に懲りて膾を吹く
コンパイラが警告だすべきだよな
出すよ。
stdio なんてつかっているやつはばかです
そうです
gcc以外を使ってるやつはばかです
>>176 printf("%s") ;
に警告を出すのはLINTなどの仕事であって、コンパイラの仕事じゃないだろ。
void OutputMessage(const char* pStrMessage) {
printf(pStrMessage) ;
}
OutputMessage("something contains %s") ;
それに、こういうのに対処できないよね。
>>182 仕事云々については「じゃあlint動かせばいいじゃない」ってだけの話
OutputMessageは、その関数の作成者がprintfの第一引数は書式指定文字列で
あることを失念してるからバグってるのであって、printfに文字列リテラルを渡して
うっかり%sなりなんなり混じってしまったという話とは関係がない
おまいさん流に言えば、馬鹿なコード書くヤシの面倒を見るのはコンパイラやlintの仕事じゃない
普段から
printf("Hello, world!");
なんて書いていると、忘れるんですよ。
printf("Hello, world!"); の検索結果 約 625,000 件中 1 - 10 件目 (0.16 秒)
puts("Hello, world!"); の検索結果 約 424,000 件中 1 - 10 件目 (0.17 秒)
Hello Worldにはputsを使うべき。
バカか。関数 hello_world() を作るべきだろ。
○○に○○しく同意、というレスは、自演の代名詞。
$ echo Hello, world!
C言語なんてもう使ってんなよ、おっさん乙
>>196 は、Cが難しくて挫折した組の人だそうです。
200 :
デフォルトの名無しさん:2006/08/20(日) 21:34:41
>>197 オブジェクト指向が理解できなくてCに固執した組の人だそうです
201 :
デフォルトの名無しさん:2006/08/20(日) 21:53:09
携帯のアプリって、
C言語でsprintfとか使って作ってるってことか?
SymbianOS だと,C/C++ 標準関数やクラスは一切使わない。用意されてない。
でもやっぱり %s みたいな書式指定は便利だから,踏襲してる。
au 携帯の OS は何使ってるか知らないけど
まあ正確には,*printf みたいな標準関数を使ってのバグというよりは
そういう書式指定をする,独自の関数を使って起きたバグなんじゃまいか。
独自の関数であってもなんにしても、
書式化出力関数に文字列を直接渡しちゃうのはかなりお粗末。
しかもユーザーが任意の文字列を送れるし…
>>45 > printf(strSomeThing) ;
> なんていうのをうっかり書いてしまうから。
ちゃんと書くなら、
printf(strSomething):
ってこと?
皮肉なのかアホなのかわからんが
printf("%s",strSomeThing);
書式化処理をしない
print
があればいいのにな。
fputs使えばいい、というのは、どうかと思うのです。
#define print(str) fputs((str),stdout)
>>207 それは、「fputs使えばいい」そのもの。
標準Cライブラリにprintがあるべき。
そして入門書のサンプルコードでは、
print("計算結果\n") ;
printf("合計は %d です。\n", hoge) ;
のようにすればいい。
それだったら
printf("計算結果\n合計は %d です。\n", hoge) ;
でいいだろ、という話もあるが、自分が見た本は、すべからく複数回printfを呼んでいた。
.NET FrameworkのConsole.Writeのようなのを期待してるのかな
puts()とfputs()の仕様が微妙に違うのが問題だよな。
#つーか、末尾に改行を補うなんて余計なことを……
>>210 古い言語は「一行出力関数」があったから、その名残。
ごめん、まったくこれっぽっちもスレに関係ないんだが
>208
>すべからく複数回printfを呼んでいた。
気になってしょうがない。
ことごとく、かな。