• ベストアンサー

文字列の配列について

a-kumaの回答

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> どのようにクラス化をすればよいか教えていただければ幸いです あくまでも一例として読んで下さい。 「定義情報」のように、プログラムの中でインスタンスがひとつで良いものを実装する やり方に Singleton パターンというのがあります。 例えば、こんな感じ。どんな定義情報か分からないんで、時刻情報を扱うクラスだと 思って名前をつけます。 ◆ ヘッダ class TimeRangeInfo { private: TimeRangeInfo(); static TimeRangeInfo* timerangeinfo_g; public: static TimeRangeInfo* Instance(); // 定義アクセス用のメソッド const char* getLabel(int hour, int minute) const; }; ◆ソース #include "timerangeinfo.h" TimeRangeInfo* TimeRangeInfo::timerangeinfo_g = NULL; TimeRangeInfo* TimeRangeInfo::Instance() { if (timerangeinfo_g == NULL) { timerangeinfo_g = new TimeRangeInfo; } return timerangeinfo_g; } TimeRangeInfo::TimeRangeInfo() { // 定義の内容を自分のメンバーに登録する } const char* TimeRangeInfo::getLabel(int hour, int minute) const { // 自分で持っている定義情報から hour、minute にあたる情報を抜き出す return 抜き出した値; } ◆使う人 #include "timerangeinfo.h" // 16:50 は、どんな区分か? cout << TimeRangeInfo::Instance()->getLabel(16, 50) << endl; という感じです。 # コンパイルなんかはしてないけど、勘弁 m(_ _)m 定義情報にアクセスするためのキーが何か存在するでしょうから、それを引数に した情報取得用のメソッドを必要な分だけ作れば良い。 このクラス内部に、どのように定義情報を持つかは、外部には隠蔽されている のだから、どんな風にやっても良いですね。例えば、外部変数とするにしても static な(つまり、extern ではない)スコープにすれば、あまり影響は出ない ですし。 ◆ TimeRangeInfo クラスのソース #include "timerangeinfo.h" TimeRangeInfo* TimeRangeInfo::timerangeinfo_g = NULL; static const char* data[100][256] = { {"data-1", "data-2", .... //延々とデータが続く 100×256 のデータのキーが何か想像がつかない(100種類のキーに対して、 データが 256 個もあるの?)のですが、私だったら、hash_map なんかを 使うかなあ。 # でも、TimeRangeInfo クラスの内部に隠蔽されているから、何を使っても # 後で変更するのは簡単ですよね。

soraprio
質問者

お礼

パソコンが調子悪く回答に送れて申し訳ありませんでした。 なるほど、いろいろ勉強になりました。 しかし、C++とはなんておくが深いものなのでしょう。 重ね重ね、ご丁寧にありがとうございました。

関連するQ&A

  • ソースファイルの分割について

    a.h クラスの定義 a.cpp クラスのメンバ関数の定義 b.h #include "a.h" クラスの定義 b.cpp クラスのメンバ関数の定義 ----c.cpp---- #include "a.h" #include "b.h" a.hで定義したクラスの宣言 b.hで定義したクラスの宣言 メインの処理 ----------------------------------------- b.cppで定義しているクラスのメンバ関数にて a.cppで定義したクラスのメンバ変数にアクセスしたいのです。 どうするのが一番良いのでしょうか? a.cppにメンバ変数を返すだけの関数を定義してb.cppでc.cppで宣言したa.hのクラスを extern宣言してみたのですがエラーが出てコンパイルが通らないです。

  • 配列内の文字列を読み込む方法

    C++言語において質問です。あまり詳しくないので、変な質問でしたらすみません。 配列の文字列内にスペースが有る場合とない場合で表示を分けるものを作りたいと 思っています。 以下のようなものを書いた所、動くけど『iがいらない』、『メモリリークしている』 という風に言われました。自分でも調べてみたのですが、2つの事を解決できません。 どのようにすればよいのか、お教え願えませんか。 又、この場合のメモリリークとはどういう意味なのでしょうか? #include <stdio.h> #include <string.h> #include <ctype.h> char* name_list[] = {"", "AAA A", "BBBB", 0}; void main(){ int i = 1; char *b=0; for(char** a = &name_list[1]; *a != 0; a++, i++){ for(char* p = *a; *p != '\0' && !isspace((unsigned char)*p); p++) ; if(*p != '\0'){ b = new char[strlen(name_list[i]) + 3]; sprintf(b, "space %s", name_list[i]); } else { b = new char[strlen(name_list[i]) + 1]; strcpy(b, name_list[i]); } fprintf(stderr, "%s\n", b); } return; }

  • 文字列の検索

    プログラミングの勉強の際に下のプログラムを作りました。 最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 コンパイルは通るのですが、文字列を2つ入力すると 「セグメンテーション違反です」と表記されます… どこが悪いのでしょうか? どなたか解説・指摘・模範解答などおねがいします。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(*c!='\0'){ c=a; d=b; while(*c!='\0' && *d!='\0') if(*c!=*d) printf("0"); break; c++; d++; } if(*d='\0') printf("1"); a++; return a; return NULL; }

  • C言語で文字列をかえす正しい書き方が知りたいです?

    C言語で次の警告が表示されます。 文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか? jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。 char *test(char *a, int b) { char str[BUFSIZ]; return str; <------ }

  • 文字列の連結するプログラム

    独学でプログラミングをやっているんですが2つ文字列を1つにする方法がよくわかりません。(1)のプログラムは(b+3)のところは文字の長さを指定しているからだめで(2)はstrcpyやstrcatなどのコマンドを使わずにやるそうです。While分とかでやるんでしょうか?教えてください。 (1) #include <stdio.h> int main (void){ char spelA[] = "abc"; char spelB[] = "def"; char spelC[20]; int a,b; spel[6]=0; for(a=0;spel[a]!=0;a++){ spelC[i] = spelA[i]; }; for(b=0;spelB[b]!=0;b++){ spelC[b+3] = spelB[b]; }; printf("%s\n",spelC); return(0); }; (2) #include <stdio.h> #include <string.h> int main (void){ char spelA[] = "abc"; char spelB[] = "def"; char spelC[20]; strcpy(spelC,spelA); strcat(spelC,spelB); printf("%s\n",spelC); return(0); }

  • 「外部シンボルが未解決」について教えてください

    BCCを使ってます。windowsのプログラムで、『外部シンボル 'MyCreateFontが未解決』と言うメッセージが出たのですが、リンクエラーなのでしょうか? また、『外部シンボル○○が未解決』と表示された場合、どのような処置をすればいいですか。アドバイスをお願いします。 D:\borland\bcc55\lesson>bcc32 -W -w-8057 timer.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland timer.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'MyCreateFont(int, unsigned long, const char *)' が未解決(D:\BORLAND\BCC55\LESSON\TIMER.OBJ が参照 ) こちらが、宣言の部分です。 #include <windows.h> #define ID_MYTIMER 100 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); HFONT MyCreateFont(int, DWORD, LPCTSTR); char szClassName[] = "clock"; //ウィンドウクラス int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow)

  • 文字列を表すための配列とポインタ

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、Visual Studio 2010 コマンドプロンプトです。 #include <stdio.h> void main(void) { char a[256]; char *b; printf("文字列を入力してください。\n"); printf("例「abcde」\n\n"); printf("配列型文字列を使います。\n"); scanf("%s", a); printf("文字列は%sです。\n\n", a); printf("ポインタ型文字列を使います。\n"); scanf("%s", b); printf("文字列は%sです。\n", b); }  すると、まずコンパイル時に、 「warning C4700: 初期化されていないローカル変数'b'が使用されます」 と表示されました。そして、実行すると、「配列型文字列」の方は問題ないのですが、「ポインタ型文字列」の方の実行後に、 「x.exeは動作を停止しました。 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ、解決策がある場合は Windowsから通知されます。」 と表示され、エラーとして終了してしまいます。 「char *b;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。

  • 文字列の検索

    先日同じ質問をして、プログラムの内容を修正したのですが、今度は2つ文字列を入力した後0が無限にでてきます… どなたか解説・指摘・模範解答などおねがいします。 内容は最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char *c,*d; char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(c!='\0'){ c=a; d=b; while(c!='\0' && d!='\0'){ if(c!=d) printf("0"); break; c++; d++; } } if(d='\0') printf("1"); a++; return a; return NULL; } 例 検索対象文字列:asdfghjkl 検索文字列:sdf 1と出力 検索対象文字列:asdfghjkl 検索文字列:qwer 0と出力

  • 関数に配列を渡して値を変える

    関数に配列を渡して値を書き換えたいのですが、文字配列である char b[10]="abc"; の書き換えが綺麗にできません。 どのように書いたら綺麗にできますか? void hen(int *a, char *b,char **c){ *a=7; b[0]='d'; b[1]='e'; b[2]='f'; //こういう書き方なら渡せるけれどb[10]="def"; 見たいな書き方で一行で値を渡す方法はないものかな? *c="jkl"; } void main (void){ int a=5; char b[10]="abc"; char *c="ghi"; hen(&a,b,&c); printf("%d %s %s\n",a,b,c); }

  • C++Builder6 での複素数計算

    C++builder6 で複素数計算が出来なくて困っています、 UNIT1.CPPのヘッダー部分に  #include <vcl.h>  #pragma hdrstop  #include <iostream>  #include <complex.h>  #include "Unit1.h" //-----------------------------  #pragma package(smart_init)  #pragma resource "*.dfm" を書いて イベントハンドラ部分に変数の宣言   complex<double> z; として緑色三角形の実行ボタンをクリックすると   「未定義のシンボル complex」 と言うエラーが発生します、 この解決方法を教えて頂ければ幸いです、宜しくお願いします。 (なお C++builder5 では何の問題もなく複素数計算のソフトが出来ていました)