• 締切済み

VC++2005 型についてのエラー

現在VC++2005でプログラムを作成しています。 そこでテキストファイルに書かれて保存されているものをテキストボックスに表示するというものを作っています。 そして今は、ssという変数にその表示されているものを代入してあります。そこでそのssというものと7:00とテキストファイルに書かれているものを比べてみたいと考えています。 そこでstrcmpで比べてif文を作りたいのですが、下に書いたエラーで変換できませんと出てしまいます。 このような場合はどのように修正すればよいのでしょうか? 基本的な質問かもしれませんがよろしくお願いします。 「'strcmp' : 1 番目の引数を 'System::String ^' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)」 **************************************************************** String^ ss; ss=textBox2->Lines[0]; textBox4->Text=ss; if (strcmp(ss, "7:00")==0) { MessageBox::Show("7時"); } else { MessageBox::Show("それ以外"); } ****************************************************************

みんなの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

> プログラム通りにやってみたところ不正と判断しかされなくなってしまったのですが という事なら外のifがfalse、つまりDateTime::TryParse()で失敗しているという事ですから、「ssの中身が時刻として認識できる文字列ではない」ってことになります。

xxmajimaji
質問者

お礼

わかりました。 ありがとうございます。

  • chie65535
  • ベストアンサー率43% (8525/19381)
回答No.4

System::Stringの文字列比較は「String.Compare()」を使う。 if (String.Compare(ss,"7:00")==0) { は試したか?

xxmajimaji
質問者

お礼

まだです。 試してみます。ありがとうござました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

C++/CLIでやるなら .NETFrameworkに用意されているクラスを使ってプログラミングするようにしましょう 今回は時間(時刻)を比較したいのですから DateTime型を使いましょう 例 String ^ss = textBox1->Lines[0]; DateTime dt; // ssの内容が 時刻に変換可能かチェック if ( DateTime::TryParse( ss, dt ) ) {   // 変換できたのなら『7:00』かどうかをチェック   if ( dt == DateTime::Parse("7:00") ) {     MessageBox::Show("7時");   } else {     MessageBox::Show("それ以外");   } } else {   // 変換できなかった場合   MessageBox::Show("時刻として不正です"); } # 行頭の字下げには全角文字の空白がありますので置換してください

xxmajimaji
質問者

補足

ご指摘ありがとうございます。 プログラム通りにやってみたところ不正と判断しかされなくなってしまったのですが、この場合は"7:00"というところが間違っているのでしょうか?

回答No.2

 こんばんは。  System::String^はchar*とは全くを以って性質の違う物です。  if(ss == "7:00")  で比較が出来ます。  しかし、どうしてもと言うのであるならば、  using namespace System::Runtime::InteropServices;  //マーシャリングする  IntPtr iptr = Marshal::StringToHGlobalAnsi(ss);  if (strcmp(static_cast<const char*>(iptr.ToPointer()), "7:00")==0) {     MessageBox::Show("7時");  }  else {     MessageBox::Show("それ以外");  }  //割り当てられるので必ず開放する  Marshal::FreeHGlobal(iptr);  とする事も出来ます。

xxmajimaji
質問者

補足

ありがとうございます。 if(ss == "7:00")はもう試していたのですが出来ませんでした。 マーシャリングというものもエラーが出てしまいました。

noname#76085
noname#76085
回答No.1

VC++の経験はないですが、C言語は使えます。 その上での回答ですが。 コンパイルエラーに出ている通りです。変数の型が合わないだけです。 変数の型についてもっと知りましょう。

xxmajimaji
質問者

お礼

わかりました。 ありがとうございます。

関連するQ&A

  • if文の条件式の書き方について

    現在VC++2005でプログラムを作成しています。 そこであるテキストファイルをテキストボックスに表示してからその表示されている内容の1行目をif文を使って判断するというものを作っています。 そこで、質問なのですがif文の条件を作るときに文字列として条件を入れたい場合はどのようにしたら良いのでしょうか? 現在は7:00ならばというものなのですが、読み込んだ文字列に7:00以外のものが入っていてもそのまま判断されてしまうのできっと条件式のところが問題だと思うのですが。 下に作成中のコードを書きますので、良かったらご教授お願いします。 ********************************************************* String^ ss; ss=textBox3->Text; ss=textBox3->Lines[0]; textBox5->Text=ss; String^ time; time=textBox5->Text; if (char time='7:00'){ MessageBox::Show("7時"); } else { MessageBox::Show("ミス"); } **********************************************************

  • VC++2005 型変換

    テキストファイルを開いて、そのファイルの中身をfgetsで読みながらそれを何回か繰り返すというようなことをするというプログラムを書いてます。プログラムは下になります。 int m; FILE* pFile; char buffer[128]; pFile=fopen("p1.txt","r"); pFile=textBox1->Text; if (pFile==NULL) { label1->Text="ファイルがありません。\n"; } for(m=1; m<=8; m++) { fgets(buffer,128,pFile); String^ buffer; buffer=textBox2->Text; } } デバックを行うと次のエラーが出てしまいます。 error C2440: '=' : 'System::String ^' から 'FILE *' に変換できません。 どのように直せばよいのでしょうか?

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

     VC++2005ExpressEdition + PlatformSDKを使用しています.  char型配列をString型にしたいと思っています(MessageBoxで表示するため).  int型ならば, > String^ out = String::Format("{0}", i ); > MessageBox::Show(out); などとできます.  下のアドレス(*1)のNo.2の答えにあるように > char ss[256]; > String^ out; > out=ss; とすると > error C2440: '=' : 'char [128]' から 'System::String ^' に変換できません。 なるエラーが出ます(S を大文字にしたりハットを付けたりしています).  char型の配列のString型への変換はどのようにすればいいのでしょうか. (*1)http://oshiete1.goo.ne.jp/kotaeru.php3?q=479640

  • 【C#】textBoxの指定行のデータを削除

    凄く基本的なことかもしれないのですが色々検索しても見つからなかったので質問させてください。 Visual C# 2010を使っています。 textBoxのMultiLineをtrueにして複数行書けるようにしています。 そこで、プログラム上で指定の行を削除したり書き換えたりする方法を知りたいです。 指定の行のデータを取得する方法はわかったのですが、応用できませんでした。 MessageBox.Show(textBox1.Lines[0].ToString()); で、1行目のデータをMessageBoxで表示できました。 なので、以下のように書けば削除できるかと思いましたがダメでした。 textBox1.Lines[0] = ""; もしくは textBox1.Lines[0].Remove(0); 目的は、以下のような複数行のデータがあった場合に指定の行を消すといったことです。 1234 5678 9012 で、例えば、2行目を消して 1234 9012 としたいです。 textBox1.Text = textBox1.Text.Replace(textBox1.Lines[0], ""); とやって置き換えることはできるのですが、同じデータがある場合に全て置き換わってしまうのと、改行が残ってしまうので微妙です。 よろしくお願いします。

  • VC++でconst void*に渡す

    Sqlite3.dllの sqlite3_bind_text16に値を渡したいのですが、 3つ目の引数がconst void*となっているのでtextBox1->Textを渡したいので 適当にいろいろやったのですがよくわかりません。 sqlite3_bind_text16(&stmt,1,,-1,0); 他の引数は一応上のとおりです。

  • C++型変換について

    C++を始めたばかりの初心者です VBからstringの引数をもらって C++のdllで処理をしてstringを返すものを考えています dll内で処理をするのにstd::stringに変換したいのですが 変換ほうほうがわかりません charをstd::stringへ std::stringをcharへの変換方法を教えてください 宜しくお願いします。

  • 'const char *' 型は 'char *' 型に変換できない ??

    Case 1 Text9.Text = "AB"; Text10.Text = "A"; // 1文字目 Text11.Text = "B"; // 2文字目 case 2; Text9.Text = "Ab"; Text10.Text = "A"; Text11.Text = "b"; case 3; Text9.Text = "aB"; Text10.Text = "a"; Text11.Text = "B"; case 4; Text9.Text = "ab"; Text10.Text = "a"; Text11.Text = "b"; 上記のようなCase 文を C を使って作成したいのですが, A~J の大文字とa~jまでの小文字をつかって,2文字の文字列をつくるとき, 1文字目と2文字目が,形態も名称も異なる文字列(例 AB , Ab aB, ab, AC, Ac aC ac, ...)のcase文をつくりたいのですが, 'const char *' 型は 'char *' 型に変換できないというエラーメッセージがでてしまいます.下記プログラムをどう直せばいいかおしえてください. #include <stdio.h> #define MAX_NAME 256 int main(void) { const char *NAME12 = "Text9"; const char *NAME1 = "Text10"; const char *NAME2 = "Text11"; const char *ALPH = "ABCDEFGHIJabcdefghij"; FILE *fp = NULL; char f_name[MAX_NAME]; int count = 0; char *p = ALPH; char *q = ALPH; printf("ファイル名:"); scanf("%s", f_name); fp = fopen(f_name, "w"); if (fp == NULL) { printf("'%s':ファイルが見つかりません\n", f_name); } else { for (p = ALPH; *p != '\0'; p++) { for (q = ALPH; *q != '\0'; q++) { if (*p != *q) { count++; fprintf(fp, "Case %d\n", count); fprintf(fp, "%s.Text = \"%c%c\"\n", NAME12, *p, *q); fprintf(fp, "%s.Text = \"%c%c\"\n", NAME1, *p, *q); fprintf(fp, "%s.Text = \"%c%c\"\n", NAME2, *p, *q); } } } fclose(fp); } return 0; }

  • VC++.net iniファイルパス指定の仕方

    VC++2005.netマネージでiniファイルを使いたいと思っています。 iniファイルから変数を読み込む関数GetPrivateProfileInt,GetPrivateProfileStringの引数にはiniファイルの絶対パス(c:\~set.ini)を指定しなければならないようです。 実行ファイルと同じ場所にiniファイルを置きたいのですが、これはどうやって指定するのでしょうか。 私が思いついたコードです。 String ^exepath = gcnew String(System::Windows::Forms::Application::ExecutablePath);//実行ファイルのパスを取得。 char charpath[500]={0}; sprintf(charpath,"%s",exepath->ToString);//string型からchar型へ変換する。 int len = strlen(charpath); charpath[len - ??] = \0;//実行ファイル名を消す char ininame[] = "setting.ini"; strcat(charpath,ininame); これは実行ファイルの絶対パスと実行ファイル名を取得し加工します。 c:\~~\prog\test.exe(string型の文字列) ↓ c:\~~\prog\test.exe(char型の文字列) ↓ c:\~~\prog\ (後ろつまり実行ファイル名の部分を削る) ↓ c:\~~\prog\setting.ini (iniファイル名を後ろに追加する。) ただ、これには問題がありこの変数を引数にしたのでは >'GetPrivateProfileIntW' : 1番目の引数を'const char[10]'から'LPCWSTRに変換できません。 と出ます。 どうすればiniファイルのパスを指定できるのでしょうか。

  • VC++にてCString型のフルパスをfopenする

    VC++(VisualStudio2005)にてCString型のフルパスをfopenしたいと思っています。 他ページでは char *name = new char[filepass.GetLength()+1]; strcpy( name, filepass ); でstrcpyでCstring→charへ変換できるとあったのですが、 'strcpy' : 2 番目の引数を 'CString' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。 というエラーをはいて実行できませんでした。 lstrcpy(name, filepass)でも 1 番目の引数を 'char [100]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 となりました。 何か良い方法をご存じないですか? char型に変換できなくとも、結果的にfopenを使ってファイルオープンできれば良いです。

  • C言語strcmpについて

    下記のプログラムでstrcmp動かしたところ、理論的には、68と表示されるところ、1と表示される理由を教えてください。詳細部分は、省略します、たとえば、include,const strcmp("ABCDE","ABC"); int strcmp(char *s1,char *s2){ while(*s1==*s2){ if(*s1=='\0') return (0); s1++; s2++; } return(( unsigned char)*s1 - (unsigned char)*s2);