char型とstring型について

このQ&Aのポイント
  • C++のchar型とstring型について質問があります。関数の引数に直接文字列を挿入するケースと変数を引数にするケースでは、コンパイル結果に差があるようです。
  • char型とstring型の違いは何でしょうか?また、char*型との違いについても教えてください。
  • 質問内容のコンパイル結果の違いには何が影響しているのでしょうか?
回答を見る
  • ベストアンサー

char型とstring型について

char型とstring型について質問があります。 言語はC++です。 以下の関数があったとします。 void test(string a, string b string c){ 処理 } この関数を下記のように利用した場合について質問があります。 a.引数に直接文字列を挿入したケース test("aaa","bbb","ccc") b.変数に文字列を設定し、変数を引数にしたケース string a="aaa" string b="bbb" string c="ccc" test(a,b,c) (1)はコンパイルエラーになり、(2)は成功しました。 同じ様に見えるのですが、何が違うのでしょうか? また、関数の引数の型をchar*にした場合、(1)(2)のケースでコンパイルが通りました。char*型だと何が違うのでしょうか?

  • rui58
  • お礼率70% (14/20)

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

  • ベストアンサー
回答No.2

> (1)はコンパイルエラーになり、 再現できませんでした。他に理由があるのでは? #include <iostream> #include <string> using namespace std; void test(string a, string b, string c) { cout << a << b << c << endl; } int main() { test("aaa","bbb","ccc"); string a = "aaa"; string b = "bbb"; string c = "ccc"; test(a,b,c); }

rui58
質問者

お礼

当方の確認ミスでした。 ソースまで提示して頂き、ありがとうございました。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

>(1)はコンパイルエラーになり、(2)は成功しました。 両者の違いが再現できる、最小限のソースを提示してください。 また、どんなコンパイルエラーが出たかも提示してください。

rui58
質問者

お礼

失礼いたしました。 コンパイルエラーは内部の処理のほうでした。 ご回答ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

(1) と (2) は「同じ」といえば同じになります. 処理系のバグじゃないかなぁ. 処理系がわからんとなんとも判断できないけど.

rui58
質問者

お礼

当方のミスです。 申し訳ございません。 ご回答ありがとうございました。

関連するQ&A

  • キャストの仕方(std::stringをconst char*へ)を教えてください。

    c++で作成したものをコンパイルしたところ、 下記のようなエラーメッセージが表示されました。 cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘int stat(const char*, stat*) 自分の解釈では、 stat関数の第1引数がconst char*なのに、 プログラムの中では  #include <sys/types.h>  #include <sys/stat.h>  using namespace std;   :  string aaa;   :  struct stat st;  if(stat(aaa,&st)!=-1){・・・   : という感じで記述しているので、 型が変換できない という感じのことを言っているのかなぁ・・・? と思っているのですが、間違いですか? また、間違えていないとしたら・・・、 このstringで宣言しているaaaをchar*(?)にキャストする方法 と言いますか、このエラーを解決する方法を教えてください。 毎度のことですが、理解不十分で、質問の意味が通じにくいかも しれませんが、どうか宜しくお願いいたします。m(_ _)m

  • C#での関数テーブルの作り方

    お世話様です。 C++で関数ポインタを使用していたのですが、C#にそのまま持ってくると エラーが発生します。 C++でのコードをどのように変更したら良いでしょうか。 [C++] typedef struct {  char *cmd;  BOOL (*exe)(char* oprand); }FTBL; FTBL tbl[] = {  { "AAA", aaa },  { "BBB", bbb },  { "CCC", ccc } }; [C#](当方のコードでエラーがでます。) delegate bool Execute( string oprand ); struct FTBL{  string cmd;  Execute exe; }; FTBL[] tbl = {  { "AAA", aaa },  { "BBB", bbb },  { "CCC", ccc } }; コマンド名とコマンド関数のテーブルですが、要は関数テーブルの 作り方を知りたいのです。 ご教授よろしくお願いいたします。

  • System::Stringからconst charへの変換

    aという変数がSystem::String型であります。 そこで次に行いたい処理のために、const char*に変換したいのですが、下記のページを参考にプログラムしてみたのですがうまくいきませんでした。 うまくいかなかったというのはまだSystem::String型のままで変換できていなかったとエラーで出てしまいます。 そのような場合は、どのように型変換すればよいのでしょうか?

  • String型をchar型配列にしたい

     VC++2005ExpressEdition + PlatformSDKを使用しています.  String型をchar型配列に変換したいと思っています.  自分なりに調べてみたのですが, > String^ str = gcnew String("test"); > char chr[5]; > chr = str->ToCharArray(); などとしても次のようなエラーが出ます. > error C2440: '=' : 'cli::array<Type,dimension> ^' から 'char [5]' に変換できません。  String型からchar型配列への変換はどのようにすればいいのでしょうか.

  • メモリ違反でソフトが強制終了してしまいます。

    コンパイルして実行すると ttp://kei100.jp/diary/images/20050612_0.png このようなメッセージが表示されてしまいます。 #include <windows.h> #include <stdio.h> #include <string.h> void main(void) { HANDLE hFile; HGLOBAL hg = GlobalAlloc(GMEM_FIXED, 1000); char* test = "test"; LPTSTR aaa="spacetestspace"; char* bbb = NULL; char ccc[5]; aaa=(char*)GlobalLock(hg); bbb = strstr(aaa, test); strncpy(ccc, bbb, strlen(test)); printf("ccc = %s \n", ccc); GlobalUnlock(hg); GlobalFree(hg); GlobalFree(aaa); } どなたか解決方法を知っている方、回答よろしくお願いします。

  • 配列の変換

    配列の中身を変換したいのですが、どうコーディングするのが一般的でしょうか。 以下を、 char Test1[]= "aaa\n"         "bbb\n"         "ccc\n"         "ddd\n"; ↓このように直す。またこれを上↑の書式へ変換する。 char *Test2[] = {    "aaa",    "bbb",    "ccc",    "ddd",    NULL }; malloc() 関数を使うと思うのですが・・・ 変換のサンプル集みたいのがあれば教えていただきたいです。

  • (char*)について

    ソースを見ている際に、 以下のようなソースがありました。 構造体Aのメンバ char x char y[5+1] の2つがあり、 ある関数のなかで構造体Aのポインタを引数で渡しており、 それをマクロに対して、 (1)マクロB("あいうえお",(char*)A->x, sizeof(A->x,) ) (2)マクロB("かきくけこ",A->y sizeof(A->y) ) という風にわたしていました。 そこで質問なのですが、(1)に対してだけ第2引数に、(char*)が ついていますが、これはどういった意味があるのでしょうか?

  • vbs csv編集 プログラム

    vbsで以下のように編集したいです。 <編集前>    A     B      C 1 aaa@aaa.jp bbb@bbb.jp ccc@ccc.jp 2       bbb@bbb.jp ccc@ccc.jp 3             ccc@ccc.jp <編集後>    A     B      C      D 1 aaa@aaa.jp aaa@aaa.jp bbb@bbb.jp ccc@ccc.jp 2 bbb@bbb.jp       bbb@bbb.jp ccc@ccc.jp 3 ccc@ccc.jp             ccc@ccc.jp <編集後> (1)A列に値がある場合は、その値をA列にコピーする。 (2)A列に値がなく、B列に値がある場合は、その値をA列にコピーする。 (3)B列に値がなく、C列に値がある場合は、その値をA列のコピーする ※A、B、C列すべてに値がある場合は、A列の値をA列(編集後)にコピーする。 上記可能でしたら、コードのご教示お願いいたします。

  • RS232Cシリアル通信について

    現在VC6++でRS232Cの通信プログラムの機能の追加をしている(元は違う人が製造)のですが、一部わからない部分がありました。 RS232Cを使用して電文全てログファイル出力したいのですが、 //送信 aaa = WriteFile( bbb, (UCHAR *)ccc, ddd, &eee, NULL); //受信 aaa = ReadFile( bbb, (UCHAR *)ccc, ddd, &eee, NULL); の様に記述がしてあり、そのすぐ後ろにログファイルを出力する記述 PrintLF((CHAR *)ccc);  //PrintLF・・・引数をファイルに出力する関数 を書いています。 (1)PrintLFの引数はunsigned charではない為PrintLF((CHAR *)ccc);と記述しましたがこれでよろしいでしょうか?(文字化けなどはしない?) (2)電文全てログファイル出力したいとなると、WriteFi・ReadFileのすぐ後にログ出力の記述(第2引数を出力)してあげればよろしいでしょうか? (3)実際にテストが出来ない為、いいソフトはないでしょうか? 以上ですがよろしくお願いいたします。

  • 文字列のメンバ変数を外部変数のように扱いたい

    済みません。質問なのですが、 メンバ変数を外部変数のように扱うにはどうしたらよいのでしょうか? int型などの場合、 class test{ static const int a; }; const int test::a = 10; とすればよいですよね? これをcharの配列にして class test{ static char a[7][32]; }; char test::a[0] = "test"; とすると サイズが0の配列を割り当てまたは宣言しようとしました というコンパイルエラーがでてしまいます…。 多次元配列の場合はstatic変数としてもてないのでしょうか? char** として宣言してもどこでnewを行えばよいか解りません。 コンストラクタの中で行えば そこでstaticではなくなってしまいますし…。 後、できればstringクラスの配列で持ちたいのですが #include <string> class test{ static string test[7]; }; string test::test[0] = "aaa"; なんてことができますでしょうか? 質問内容が解りにくいかも知れませんが どうか教えてください。 宜しくお願いいたします。

専門家に質問してみよう