
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も見ています
-
printfの出力内の文字をdefineしたい
C言語・C++・C#
-
#define中の#のエスケープ
C言語・C++・C#
-
char*を初期化したいのですが
C言語・C++・C#
-
-
4
define で 配列
C言語・C++・C#
-
5
画面を強制的に再描画させる方法
C言語・C++・C#
-
6
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
7
C言語のポインターに関する警告
C言語・C++・C#
-
8
ループを途中で抜けたいのですが。
C言語・C++・C#
-
9
スレッドの終了はどうやるんですか?
C言語・C++・C#
-
10
文字列の切り出し
C言語・C++・C#
-
11
#define 文
C言語・C++・C#
-
12
ファイルへの書込み処理が異常に遅い
C言語・C++・C#
-
13
関数から配列を返すには?
C言語・C++・C#
-
14
charからLPTSTRへの変換方法
C言語・C++・C#
-
15
unsigned char の配列で途中で0を含む時のstrlen
C言語・C++・C#
-
16
char型にint型の数値を代入する。
C言語・C++・C#
-
17
'int' から 'LPCSTR' に変換できません。
C言語・C++・C#
-
18
newしないオブジェクトについて
C言語・C++・C#
-
19
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
20
C言語初心者の質問失礼します。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで特定の列が0表示の場...
-
特定のPCだけ動作しないVBAマク...
-
Excel_マクロ_現在開いているシ...
-
ExcelのVBA。public変数の値が...
-
Excel マクロ VBA プロシー...
-
Excel・Word リサーチ機能を無...
-
エクセルで別のセルにあるふり...
-
エクセルの関数とマクロの区別
-
エクセル VBA実行中のApplicati...
-
オートフィルターとExcelマクロ...
-
エクセルのマクロについて教え...
-
アクセス マクロ クリップボ...
-
TERA TERMを隠す方法
-
EXCEL VBAでマクロの最後でFind...
-
エクセルマクロ 2行とびでAか...
-
エクセルに張り付けた写真のフ...
-
Excelマクロで元データを簡潔な...
-
マクロの一時停止機能について
-
WORD テキストボックスを全ペ...
-
インクルードガードの命名の仕方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで特定の列が0表示の場...
-
特定のPCだけ動作しないVBAマク...
-
Excel・Word リサーチ機能を無...
-
一つのTeratermのマクロで複数...
-
Excel_マクロ_現在開いているシ...
-
メッセージボックスのOKボタ...
-
Excel マクロ VBA プロシー...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
エクセルで別のセルにあるふり...
-
ExcelVBAでPDFを閉じるソース
-
ダブルクリックで貼り付けた画...
-
Excel マクロでShearePoint先の...
-
TERA TERMを隠す方法
-
マクロ実行時、ユーザーフォー...
-
Excelのセル値に基づいて図形の...
-
特定文字のある行の前に空白行...
-
エクセルマクロでワードの一ペ...
-
エクセルで縦に並んだデータを...
-
Excel VBAからAccessマクロを実...
おすすめ情報