2014年3月25日火曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅢ部(高度な型とクラス)の15章(シンプルなポインタ)、15.8(設問の解答)、設問 15-2.を解いてみる。

その他参考書籍

設問 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 コメント:

コメントを投稿