オライリーC実践プログラミングのP203、例13-11の例で質問です。
このプログラムでは一時的なファイル名を返す関数、tmp_nameがあるのですが
このプログラム中の以下の行がよく分かりません。
name[3] = sequence + '0';
直感的にsequenceだけでよさそうな気がするのですが以下のように書き直すと
出力結果にsequenceの数字がでずただ"tmp"と出力されるだけでした。
name[3] = sequence;
char型にint型を使うための手段なのでしょうか?
下記にプログラム全体を載せておきます。よろしくお願いします。
#include <stdio.h>
#include <string.h>
char *tmp_name(void)
{
static char name[30];
static int sequence = 0;
++sequence;
strcpy(name, "tmp");
name[3] = sequence + '0';
name[4] = '\0';
return (name);
}
int main()
{
char *tmp_name(void);
printf("%s\n", tmp_name());
return (0);
}
No.2ベストアンサー
- 回答日時:
これは、0から9までの数値をそれに対応する文字に変換するお手軽かつ問題のある手法です。
ご存知かもしれませんが、コンピューターでは文字は内部的には対応する数値で表されています。
ですから、C/C++ではchar形の中にあるのは文字ではなくその文字に対応する数値です。
したがって、
sequence + '0'
は0という文字を表す数値にsequenceを足した値になります。文字と数値の対応はたいてい0という文字の次に1, 2, ..., 9と続くようになっていますので、結果、sequenceが0なら0という文字を表す数値、sequenceが1なら1という文字を表す数値、…という値になります。
参考キーワードとして「ASCIIコード」を調べるといいでしょう。
数値から文字への変換がたった1回の足し算で出来る、とってもお手軽な方法ですよね?
でも、以下のように問題があるのであまり使わないほうがいい方法です。
・0から9までしか使えない
上で書いたとおり、この方法でsequenceが0なら0という文字に、1なら1という文字に変換できます。……では、sequenceが-1だったら?10だったら?
・そもそも前提に疑問が残る
文字と数値の対応はたいてい0という文字の次に1, 2, ..., 9と続くようになっています。……でもあなたの処理系で本当に連続して並んでいますか?将来そのように並んでない処理系への移植がないと100%言い切れますか?
No.1
- 回答日時:
僕は十分C言語の知識があるわけじゃないけど…例えば、こう書けばわかるだろうか?
http://ideone.com/BzD4f
tmp65じゃないよ?
http://ideone.com/ilTLE
tmp10じゃないよ?
自信はないけど、tmp10とかにしたかったらこうなるんじゃないかと。
http://ideone.com/XwpqO
#sprintfとstrcatはそれぞれ、null characterをちゃんと付け足すようだ。
http://www.cplusplus.com/reference/clibrary/cstd …
http://www.cplusplus.com/reference/clibrary/cstr …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Java java final 1 2022/06/10 22:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlでuse socketを使用してフ...
-
電話番号を読み込むプログラム...
-
CGIメールフォームの件名について
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
「value」に2つの値をセットす...
-
htmlからパラメータで、cgiに渡...
-
VB.net データーグリッドビュー...
-
select値をhiddenのvalueに渡し...
-
チェックボックスの返す値
-
postデータのあるページの再表示
-
[HTML]プルダウンメニューの横...
-
FORMのselectの選択肢を最初か...
-
一つの検索窓で複数のサイトか...
-
1つのformに2つのsubmitボタン
-
index.html(トップページ)か...
-
htmlでセルの値を取得して計算...
-
proftpdで困ってます。
-
Rubyのmechanizeを利用したファ...
-
別formのhidden項目を自form値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SUN BBSの改造方法
-
CGIメールフォームの件名について
-
perlで書いたcgiでsqliteの使い...
-
CGI(Perl)内での必須項目チェ...
-
チェックボックスでのor検索
-
入力フォームに全角・半角スペ...
-
Windows7でVBScriptによるネッ...
-
tracert ができない原因
-
配列をグループ化して出力したい。
-
電話番号を読み込むプログラム...
-
JNAVIから提供されたメー...
-
日本語文字化け(GETメソッド?)
-
文字って数字で表現・・・
-
sendmail -fオプションの指定は...
-
【ASP.NET MVC】フォームヘルパ...
-
sendmailのメール送信ができま...
-
【CGI】画像の表示の仕方【Mini...
-
添付つきメールフォーム:「an ...
-
同じname属性の結果を1行にまと...
-
太郎を太と郎に分ける方法。
おすすめ情報