• ベストアンサー

c言語の __FILE__ について

事前定義マクロの__FILE__で取得した文字列のchar型ですか?それともwchar_t型ですか?  これは処理系に依存するのでしょうか? ちなみに現在使用処理系はVisual c++ 2005 Express Editionです。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

文字列定数ですので基本的にはchar型の配列ですが、強引にwchar_t型の配列にすることも可能です。 例えば、 #define WIDEN(str) L##str というマクロを用意して、 WIDEN(__FILE__) と書けば、wchar_t型の配列になります。

sizum
質問者

お礼

回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

char[] リテラル、たとえば "foo.c" に展開されます。

sizum
質問者

お礼

回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++Builder 2009 テキストボックスの文字列取得

    Editは、テキストボックスです。 Editには、"12345"の半角文字列が入っています。 これを、C言語の文字列として取得しようとしました。 このときのソースコードは、次の通り。 -------- char *ptr1 = new char[Edit->Text.Length()+1]; //独自領域にセーブ strcpy(ptr1, Edit->Text.c_str()); //ptr1にアドレスをコピー -------- このstrcpyの行で、エラーが出てしまい、対処に困っています。     ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ E2034 'wchar_t *' 型は 'const char *' 型に変換できない E2342 パラメータ '__src' は const char * 型として定義されているので wchar_t * は渡せない -------- Edit->Textで取得した文字列を、"12345\0"といった具合で処理をしたいのですが、どのようにしたらいいのでしょうか? 追記 「C++Builder 2009」以前のバージョンでは、難なく取得できていた。 同じソースコードなのに、何故かエラーになる。

  • C++のstringstreamについて

    こんにちは。 C++のstringstreamについて教えてください。 stringstreamはbasic_stringstream<char, char_traits<char>,allocator<char> >がtypedefされたもので、他にbasic_stringstream<wchar_t, char_traits<wchar_t>,allocator<wchar_t> >というwstringstreamというものも存在していますよね。 同じtemplateクラスに異なるパラメータを渡しているというのはわかるのですが、stringstreamとwstringstreamでは内部実装は異なるものだと思っています。 たとえばwchar_tの場合、文字列に数字などを入れる場合、swprintfという関数を使用しますよね。 同様にcharの場合は、文字列に数字などを入れる場合、sprintfという関数を使用することになるかと思います。 basic_stringstreamクラスはこの関数の切り分けはどのように実現させているのでしょうか? 私は関数のオーバーロード(sprintfとswprintfを同じ名前でラップ)か、クラスの特殊化程度しか思いつきませんでした。 char_traitsが魔法の種のような気がするのですがいまいちよくわかりません。 よろしければご教授願います。 /* 開発環境はVisualStudio2008 academic editionです。 */

  • C言語について教えてください。

    二次元配列でまとめられた「配列で実現する文字列」の文字と文字列を表示する関数を定義し、その関数の機能を確認するプログラムを作成する。 ただし、以下の例のように文字列の個数が変更されても処理できる関数を作成する。 また、文字列の文字の個数は最大9とする(一次元配列の要素数は10とする) さらに、関数printf()をできるだけ用いない。 (1)二次元配列でまとめられたすべての文字列を「一度に」表示する関数を定義する (2)二次元配列でまとめられたすべての文字列の文字を「一度に」表示する関数を定義する。このとき、前回の課題で定義した「すべての文字を表示する関数print_all_char()」を新しく定義する関数から呼び出して用いる。 (3)二次元配列に各文字列を格納してまとめるとき、初期化ではなく、配列の宣言・定義の後で、関数strcpy()を用いること(例では、初期化によりまとめている) [例] char astr[][10] = { "ABCD", "EFGHIJ", }; [実行結果の例] すべての文字列の表示 ABCD EFGHIJ すべての文字列の文字の表示 A B C D E F G H I J [ヒント] (1)二次元配列でまとめられた文字列の文字あるいは文字列を表示する関数<返却値型><関数名>(二次元配列の受け渡しに対応した仮引数の宣言、文字列の数) (2)文字列の数を求める。二次元配列のすべての要素に文字列が格納されている場合、文字列の数=二次元配列の要素数(一次元配列の数) =sizeof(astr)/sizeof(astr[0]) ただし、sizeof演算子の生成する型はsize_t型である。 この問題について教えてください。問題丸投げだとは分かっていますがどうしても分かりません。教えてください。ちなみに前回の課題の定義は下の通りです。 void print_all_char(char *chs) { while(*chs!='\0') { printf("%c\n",*chs); chs++; } } よろしくお願いします。

  • free関数で動作が止まる

    Cのプログラムを作成しているのですが、どうしても分からないので質問させてください。 以下のように、日本語を含んだテキストファイルから一行読み込み、その行の中のある部分だけ切り取るという関数を作ったのですが、メモリを解放する段階(free関数の部分)で動作が止まってしまいます。 どうすれば良のでしょうか? 使用環境は、windows vista, visual C++ Express Editionです。 よろしくお願いします。 char mid(wchar_t *str, int st, int ed, char result[128]) { wchar_t *ans = (wchar_t*)malloc(sizeof(wchar_t)); wcscpy(ans,&str[st]); ans[ed-st+1] = L'\0'; wcstombs(result, ans, 128); printf("result = %s \n",result); free(ans); ans = NULL; return 0; } *str:日本語を含んだ文字列(1行分) st:切り取りを始端 ed:切り取りの終端 ans:切り取り結果 result:切り取り結果(マルチワイド文字列) また、何故かワイド文字列で定義した「ans」のままではうまくいかず、マルチワイド文字列「result」だとうまくいきませんでした。 これの理由も、できればお願いいたします。

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • C言語で文字列の比較をしたいです。

    C言語で文字列の比較をしたいです。 現在Visual C++ 2008 Express EditionをつかってWindowsプログラミングの勉強をしているのですが、文字列同士の比較で上手くいかなくなってしまったので、教えてください。 プログラムは、確認ボタンを押すとエディットボックスの内容を取得し、取得された内容が「"abc"」であれば処理を実行するというものです。 //宣言など #include <windows.h> #include <windowsx.h> #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <string.h> static TCHAR chords[512]; //WM_CREATEの部分 hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT") , TEXT("abc") , WS_CHILD | WS_VISIBLE | ES_LEFT |ES_MULTILINE | WS_VSCROLL , 10 , 150 , 300 , 200 , hWnd, (HMENU)4, hInst , NULL); //取得 GetWindowText(hEdit, chords, 512); //判定 if(_tcscmp(chords, TEXT("abc")) == 0)実行する処理; ソースはかなり省略されていますが、エディットボックスとボタンは機能しているようです。 実行すると 「 error C2664: 'wcscmp' : 1 番目の引数を 'TCHAR *[]' から 'const wchar_t *' に変換できません。」 というエラーが出ます。 UnicodeやTCHAR周りの問題のような気がしますが、どうすれば上手くいくのでしょうか?

  • VS C++6.0のCString にて先頭1文字しかセットされないのですが・・・

    Visual Studio C++ 6.0 にてあるサンプルPGより修正を行っているのですが (VS C++6.0初心者です) CString aaa; // と定義し aaa = _T("ABCDEFG"); //と文字列をセットしても // aaaには "A"の先頭1文字しかセットされない char bbb[20]; strcpy(bbb, "%s", aaa); // としても // bbbには "A"しかセットされません。 何か設定などでこのようになるのでしょうか? これをセットした文字列をセット、取得可能とならないものでしょうか?

  • C言語の関数について教えてください。

    #include <string.h> #include <stdio.h> //すべての文字を表示する関数の定義 void print_all_char(.....) { ..... } int main(void) { char astr[5]; char *pstr; strcpy(&astr[0], "ABCD"); //ポインタpstrが文字列"EFGHI"を指すようにする ..... puts("「配列で実現する文字列」を表示する"); puts(.....); puts("「配列で実現する文字列」のすべての文字を表示する"); print_all_char(.....); puts("「ポインタで実現する文字列」を表示する"); puts(.....); puts("「ポインタで実現する文字列」のすべての文字を表示する"); print_all_char(.....); return 0; } だいたいの流れをプログラムしました。 しかし、.....のところがわかりません。 他の部分にも誤りがあるかもしれませんが、教えてください。 よろしくお願いします。

  • C言語で取得した文字列を、C++の文字列として取り扱いたいです。

    C言語で取得した文字列を、C++の文字列として取り扱いたいです。 皆さんこんにちは。 C言語で取得したchar型で定義された文字列を、 C++の「std::string」に渡したいと思っております。 どうすればかなうでしょうか? 具体的には次のような内容です。 ■C言語側 ---- char key1 = "deperture"; ---- ■C++側で「key1 = key2」としたいです。 ---- std::string key2 = key1; ---- C言語側で記述されている「key1」の値(deperture)を、 C++ソース内の「key2」に渡したいと思っています。 こうゆう場合、どんな方法をとれば適切でしょうか。 C言語側でのchar型の文字列の値を、 C++側の「std::string」型として C++のソースへ渡す方法が分からないです。 アドバイスいただけるとありがたいです。 簡単な例を頂けると更に大変ありがたいです。 以上どうぞ宜しくお願い致します。

  • UNICODE対応ってどういうことなのかわかりません

    VC++とかでUNICODE対応というと文字列をwchar_t型で扱うことなのかなと思うのですが、その場合UTF-8ってどういう扱いになっているのでしょうか? ウィキペディアを見ると、インターネットではUTF-8が主流であるようなことが書かれています。 UTF-8はアスキー文字セットとも互換性があるようなので、char型で文字列を扱うのかなと思いました。 それなのに、VC++でUNICODE対応の設定にするとwchar_tで文字列を扱うようなので、UTF-8がどういう扱いになっているのかよくがわからないのです。 どなたかお答え頂けないでしょうか。 よろしくお願いします。