開発環境
- 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 コメント:
コメントを投稿