開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C++ (プログラミング言語)
- g++(コンパイラ)
C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅢ部(高度な型とクラス)の15章(シンプルなポインタ)、15.8(設問の解答)、設問 15-2.を解いてみる。
その他参考書籍
- C++プログラミング入門 (グレゴリー サティア (著)、ダウグ ブラウン (著)、Gregory Satir (原著)、Doug Brown (原著)、望月 康司 (翻訳)、谷口 功 (翻訳)、オライリージャパン)
設問 15-2.
コード(BBEdit, Emacs)
sample268.cpp
#include <iostream> #include <cstring> char *tmp_name() { static char name[30]; static int sequence = 0; ++sequence; strcpy(name, "tmp"); name[3] = static_cast<char>(sequence + '0'); name[4] = '\0'; return (name); } int main(int argc, char *argv[]) { char name1[30]; char name2[30]; // 問題のコードのままだと、nameは永続的な変数なので、name1, name2ともに、 // 2回目に呼び出されたtemp2をポイントすることになる。 // この問題を回避するには、name1、name2をポインタではなく配列に変更して、 // strcpy関数を使ってコピーするようにすればいい std::strncpy(name1, tmp_name(), sizeof(name1)); std::strncpy(name2, tmp_name(), sizeof(name2)); std::cout << "Name1: " << name1 << '\n'; std::cout << "Name2: " << name2 << '\n'; return (0); }
Makefile
# # FSFのg++コンパイラ用のMakefile # CC=g++ CFLAGS=-g -Wall all: sample268 sample268: sample268.cpp ${CC} ${CFLAGS} -o sample268 sample268.cpp clean: rm sample268
入出力結果(Terminal)
$ make && ./sample268 g++ -g -Wall -o sample268 sample268.cpp Name1: tmp1 Name2: tmp2 $
0 コメント:
コメントを投稿