
No.6ベストアンサー
- 回答日時:
こんにちは。
やりたいことの解釈ですが、(※勘違いの場合はすみません。)
1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
例)
#define A "xxx" //マクロ名=A
char str[] = "A"; //"A"はマクロ名
2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
定義された文字列を渡したい。
例)
func( str ); //←この場合
↓
func( "xxx" ); //←として展開される
ということで宜しいでしょうか?
だとした場合、少し回りくどいやり方かもしれませんが、以下のような文字列
変換用のマクロを定義してみては如何でしょうか?
※基本的には、他の回答者の方と同じように strcmp関数 を使用します。
■マクロ例
==============================
//文字列を定義したマクロ …※1
#define A "xxx"
#define B "yyy"
//引数を文字列として取得するマクロ
#define GETSTR(x) #x
//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ …※2
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str
==============================
上記マクロを使用して、関数 func にマクロ名が格納された文字列 str を
渡す場合は、
func( STR2MAC( str ) );
のような記述になります。
前提として、※2のマクロ内でstrcmp関数を用いて文字列の照合を行って
いますので、<string.h>のインクルードが必要になります。
また、※1の文字列を定義するマクロの種類(パターン)を増やす場合、
※2のマクロの判定文もそれに合わせて増やす必要があります。
上記のマクロを使用したサンプルソースを下記に掲載致します。
注)エラー処理は行っていません。
■サンプルソース
==============================
#include <stdio.h>
#include <string.h>
//文字列を定義したマクロ
#define A "xxx"
#define B "yyy"
//引数を文字列として取得するマクロ
#define GETSTR(x) #x
//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str
//プロトタイプ
void funcHoge( const char *str );
int main(void)
{
char sArg[128];
printf( "A or B ?>" );
scanf( "%s", sArg );
printf( "string1: %s\n", sArg );
funcHoge( STR2MAC(sArg) );
return 0;
}
void funcHoge( const char *str )
{
printf( "string2: %s\n", str );
}
==============================
■上記サンプルの実行結果
≫実行その1≪
A or B ?>A
string1: A
string2: xxx
≫実行その2≪
A or B ?>B
string1: B
string2: yyy
≫実行その3≪
A or B ?>hoge
string1: hoge
string2: hoge
以上です。
No.9
- 回答日時:
no.8 です。
ズレてたので追加しました。#defineSTRDEF "test2"
void myFunc ( string& str )
{
if ( str == STRDEF )
cout << "equal" << endl ;
}
int main ( )
{
myFunc ( string ( STRDEF )) ;
}
No.8
- 回答日時:
C++ の string を使えばできます。
#include <string>
#include <iostream>
using namespace std ;
string str = "test" ;
string str2 = "test2" ;
cout << str << "," << str2 << endl ;
if ( str != str2 )
cout << "not equal" << endl ;
No.7
- 回答日時:
文字列同士を比較する時に == 演算子は使えません。
strcmp() 関数を使いましょう。
char str[255];
if( strcmp( str, "xxx") ) {
/* 等しくない時 */
}else{
/* 等しい時 */
}
#define を使っても動作します。
#define STRING "abc"
char str[255];
if( strcmp( str, STRING ) ) {
/* 等しくない時 */
}else{
/* 等しい時 */
}
No.5
- 回答日時:
マクロ名による分岐というのは無理っぽいです。
基本的には名前と値を対応付けるテーブルを作ってそれを参照する
という機能が必要になると思います。
cなら、たとえば
struct MapElement
{
char* name;
char* value;
};
MapElement str_map[] =
{
{ "A" , "xxx" } ,
{ "B" , "yyy" }
};
char* NameToValue( char* name )
{
for( int i = 0 ; i < sizeof(str_map) ; ++i )
{
if( strcmp( str_map[i].name , name ) == 0 )
return str_map[i].value;
}
return "";
}
として、
printf( "%s\n" , NameToValue( "A" ) ); // "xxx" と出力される
とかでしょうか。
c++ならstd::mapを使うのがベストだと思います。

No.4
- 回答日時:
既に回答にある、連想配列がおすすめですが、
Cの範囲なら、こんな関数で対応可能。
※ただ、Cの標準ライブラリに、文字列を変換する関数があった気がする。
でも、そもそも、Cの範囲で、
> if(str == "xxx")
> のように中身を指定するのではなく
という書き方はできないので注意。
#include <stdio.h>
#include <string.h>
struct strPair
{
char *src;
char *terget;
}
strPairList[] =
{
{"A", "xxx"},
{"B", "yyy"},
{"C", "zzz"},
};
char *nextStr(char *search)
{
unsigned int i;
for(i = 0; i < sizeof strPairList / sizeof strPairList[0]; i++)
{
if (! strcmp(search, strPairList[i].src)) return strPairList[i].terget;
}
return 0;
}
という関数を作れば、
func(nextStr("A"));
は、
func("xxx");
のように動きます。
たとえば、
int main()
{
printf("%s", nextStr("A"));
return 0;
}
の出力は、
xxx
if (str == "xxx") は(Cの仕様として)できないけど、
if (! strcmp(str, nextStr("A"))) は可能で、この場合だと、
if (! strcmp(str, "xxx")) と同じ動きをする。
No.3
- 回答日時:
> strで"A"あるいは"B"という文字列を読みこんで
質問文がおかしいような。「str」は変数なのだから、手段を表す「で」というのはありえないかと。
「strに文字列を読み込む」というような、strが対象を表すのなら、あり得ると思います。
で、結局は「strcmp使え」が解答になりそうな。
あるいは、「連想配列が使いたかったら、C++でSTLを使え」とか。
参考URL:http://www.ideone.com/VnvLd
No.2
- 回答日時:
#defineで定義したマクロでは、コンパイル前にソースを書き換える、ということは理解していますか?
if(str == A)
と書いても、コンパイル時には
if(str == "xxx")
と書いたのと同じになります。動作時は、マクロAから置換した"xxx"か、マクロCから置換した"xxx"か、直接書いた"xxx"か、区別できません。
文字列"A"とマクロAを結び付けるような仕組み(配列とかハッシュとか関数とか)を用意するのが常套手段でしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
このQ&Aを見た人はこんなQ&Aも見ています
-
性格悪い人が優勝
できるだけ性格悪い人になって回答をお願いします。
-
泣きながら食べたご飯の思い出
泣きながら食べたご飯の思い出を教えてください。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
スタッフと宿泊客が全員斜め上を行くホテルのレビュー
スタッフも宿泊客も、一流を通り越して全員斜め上なホテルのレビューにありがちな内容を教えて下さい
-
カラオケの鉄板ソング
歌えばその場が絶対盛り上がる「鉄板ソング」を教えてください!
-
define で 配列
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
-
4
printfの出力内の文字をdefineしたい
C言語・C++・C#
-
5
#define中の#のエスケープ
C言語・C++・C#
-
6
関数から配列を返すには?
C言語・C++・C#
-
7
読み込み中にアクセス違反が発生しました、と出ます。これを回避することは
C言語・C++・C#
-
8
静的でないメンバ関数の呼び出しが正しくありません
C言語・C++・C#
-
9
'int' から 'LPCSTR' に変換できません。
C言語・C++・C#
-
10
charからLPTSTRへの変換方法
C言語・C++・C#
-
11
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
12
文字列の切り出し
C言語・C++・C#
-
13
#define 文
C言語・C++・C#
-
14
char*を初期化したいのですが
C言語・C++・C#
-
15
unsigned char の配列で途中で0を含む時のstrlen
C言語・C++・C#
-
16
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
17
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
18
エディットボックスで改行
その他(プログラミング・Web制作)
-
19
long型の定数の末尾にLを付ける意味
C言語・C++・C#
-
20
ループを途中で抜けたいのですが。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスのOKボタ...
-
エクセルで特定の列が0表示の場...
-
特定のPCだけ動作しないVBAマク...
-
Excel・Word リサーチ機能を無...
-
一つのTeratermのマクロで複数...
-
ExcelVBAでPDFを閉じるソース
-
Excel_マクロ_現在開いているシ...
-
Excel マクロ VBA プロシー...
-
エクセルマクロでワードの一ペ...
-
エクセルで縦に並んだデータを...
-
ExcelのVBAを使ってタイトル行...
-
エクセルのマクロをセルの値に...
-
エクセルに張り付けた写真のフ...
-
特定文字のある行の前に空白行...
-
マクロ実行時、自動で背景色を...
-
TERA TERMを隠す方法
-
マクロで空白セルを詰めて別シ...
-
マクロの連続印刷が突然不可能...
-
エクセル VBA実行中のApplicati...
-
エクセルで別のセルにあるふり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
一つのTeratermのマクロで複数...
-
Excel_マクロ_現在開いているシ...
-
メッセージボックスのOKボタ...
-
Excel マクロ VBA プロシー...
-
Excel マクロでShearePoint先の...
-
エクセルに張り付けた写真のフ...
-
ExcelのVBA。public変数の値が...
-
エクセルで別のセルにあるふり...
-
TERA TERMを隠す方法
-
ExcelVBAでPDFを閉じるソース
-
エクセルで縦に並んだデータを...
-
マクロ実行時、ユーザーフォー...
-
Excel VBAからAccessマクロを実...
-
ダブルクリックで貼り付けた画...
-
【EXCEL VBA】オートシェイプを...
-
マクロで空白セルを詰めて別シ...
-
wordを起動した際に特定のペー...
おすすめ情報