• ベストアンサー

'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; }

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★回答者 No.2 さんと同じです。 ・『const char *』型と『char *』型のタイプを合わせます。 ・つまり、  const char *ALPH = "ABCDEFGHIJabcdefghij";  const char *p = ALPH;  const char *q = ALPH; ・とするか、  char *ALPH = "ABCDEFGHIJabcdefghij";  char *p = ALPH;  char *q = ALPH; ・とします。 ・また、ちょっと間違いがあるので指摘します。 ・『fprintf(fp, "%s.Text = \"%c%c\"\n", NAME1, *p, *q);』は、  『fprintf(fp, "%s.Text = \"%c\"\n", NAME1, *p );』です。 ・『fprintf(fp, "%s.Text = \"%c%c\"\n", NAME2, *p, *q);』は、  『fprintf(fp, "%s.Text = \"%c\"\n", NAME2, *q);』になります。 ・以上。分かりますか? ●小言 ・このプログラムで出力されるCソースを、何かの処理ルーチンとして使うのですか? ・もっと良い方法がありますけど。→文字列を動的に作成する方法はどうでしょう。 ・以下にサンプルを載せておきます。→処理速度は少し落ちます。ループしているので。 ●サンプル void MakeString( int num, const char **text9, const char **text10, const char **text11 ) {  static char buff9[ 4 ], buff10[ 4 ], buff11[ 4 ];  static const char *ALPH = "ABCDEFGHIJabcdefghij";  const char *p = ALPH;  const char *q = ALPH;    for ( p = ALPH ; *p != '\0' ; p++ ){   for ( q = ALPH ; *q != '\0' ; q++ ){    if ( *p != *q ){     if ( --num <= 0 ){      *text9 = buff9; sprintf( buff9, "%c%c", *p, *q );      *text10 = buff10; sprintf( buff10, "%c", *p );      *text11 = buff11; sprintf( buff11, "%c", *q );      return;     }    }   }  } } ●使用例 const char *Text9; const char *Text10; const char *Text11; MakeString( 123, &Text9, &Text10, &Text11 ); ・以上。おわり。

その他の回答 (2)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

VisualC++のコンパイラでコンパイルしたら その部分はWarningにはなりましたがErrorではなかったです。 C++ならErrorなのでC++としてコンパイルしたのかな? 修正ですが、 > char *p = ALPH; > char *q = ALPH; を  const char *p = ALPH;  const char *q = ALPH; と直せば良さそうです。

  • stiffels
  • ベストアンサー率34% (25/72)
回答No.1

const_castを使ってみてください。

関連するQ&A

  • char型の文章をconst char*型に変換

    Visual C++ MFCでアプリケーション作成している者です。 現在、エディットコントロールに入力したファイルパスを取り込んで、ファイルのデータ読み込みをおこなうプログラムを作成しております。 しかし、当方プログラムの型など細かいことがあまりわからないため、目的が達成できず困っていたので、この場をお借りして質問しました。 コードの感じは以下のようになっております。 ------------------------------------------ TCHAR FPath;  // ファイルパスが入る FILE *fp; m_edit.GetWindowText( FPath, MAX_PATH ); // m_edit:エディットコントロールのメンバ変数 fopen_s( &fp, [FPathのconst char*], "r" ); ------------------------------------------- char型からconst char型へ変換できればいいのですが、ちょっとよくわからず… ご回答、宜しくお願い致します。

  • const unsigned char *Ptn

    度々お世話になってます。VC++2010、MFC、ユニコードを使う設定で、ワイルドカードを用いたLike処理が使いたいです。 正規表現までは、望んでいません。 それで、過去ログを見てみましたが、まだ分かりませんでした。 ◆ワイルドカードを用いた文字列検索 http://okwave.jp/qa/q287644.html を使いたいです。 一応、リンク先のソースコードを載せておきます。 _________________________________________________________________________________________________ int StrMatchMBS( const unsigned char *Ptn, const unsigned char *Str ) {   switch( *Ptn )   {     case '\0':       return (_mbsnextc(Str)=='\0');     case '*':       return StrMatchMBS( _mbsinc(Ptn), Str ) || (_mbsnextc(Str)!='\0') && StrMatchMBS( Ptn, _mbsinc(Str) );     case '?': return (_mbsnextc(Str)!='\0') && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );     default:       return (_mbsnextc(Ptn)==_mbsnextc(Str)) && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );   } } _________________________________________________________________________________________________ int KeywordDlg::StrMatchMBS( const unsigned TCHAR *Ptn, const unsigned TCHAR *Str ){ としたところ、 エラー 4 error C2050: switch 式の結果は、整数値になりませんでした。 エラー 3 error C2065: 'Ptn' : 定義されていない識別子です。 ・・・のエラーがでます。 _________________________________________________________________________________________________ int KeywordDlg::StrMatchMBS( const TCHAR *Ptn, const TCHAR *Str ){ としたところ Ptn と Str の所で、赤い波線となり、 エラー 2 error C2664: '_mbsinc' : 1 番目の引数を 'const TCHAR *' から 'const unsigned char *' に変換できません。(新しい機能 ; ヘルプを参照) _________________________________________________________________________________________________ ↓この方の質問のままなのですが、具体的に どう書けばいいのか?分かりません。 ◆UNICODE化のための書き換え http://okwave.jp/qa/q6966243.html _tcsrchr もどこで使えばいいのか分かりません。 ポインターの記述を完全に理解していないせいで、分からないのでしょうか? すみませんが、もう少し、補足して頂くとうれしいですm(_ _)m

  • なんでchar型なんでしょうか??

    なぜここ(☆☆)で char型なのかが よく・・いやさっぱりわかりません。 他の型ではだめなんでしょーか? この関数自体は挿入ソートだとわ思われるんで なんとなくこの☆☆(から以下三行あたりまで) のところの動作の意味はわかるんですが なぜchar型でなくてはならないのかが。 知っている方いたら どうか教えてください。 typedef User* PUser; typedef int (*CFT)(const void*, const void*); void ssort(void* base, unsigned int n,        unsigned int sz, CFT cmp) {    for (int i = 0; i < n - 1; i++) for (int j = n - 1; i < j; j--) {          char* pj = (char*)base + j * sz; //←ここ☆☆          char* pj1 = pj - sz;  //とここ☆☆           if (cmp(pj, pj1) < 0) { for (int k = 0; k < sz; k++) { char temp = pj[k]; pj[k] = pj1[k]; pj1[k] = temp; }     }    } /* ssort関数の引数の関数ポインタで 利用される比較関数 */ int cmp1(const void* p, const void* q) { return strcmp(PUser(p)->name, PUser(q)->name); } int cmp2(const void* p, const void* q) { return PUser(p)->dept - PUser(q)->dept; }

  • constの位置

    申し訳ありませんが、続けて質問させていただきます。 char const と const char は同じ意味でしょうか。 次のプログラムは配列をconst charと宣言しています。 ary[1]='N'; の行で、意図した通りにコンパイルエラーになります。 これはchar constと宣言しても、同じ意味なんでしょうか。 #include <stdio.h> int main(void) { const char ary[ ] = { 'A', 'B', 'C', '\0' }; ary[1] = 'N'; printf("aryは%s\n", ary ); return 0; } また、 const int a=1; int const a=1; この2つは同じ意味でしょうか。

  • fgetcの返却値 EOFについて

    C言語について質問です。あまり詳しくないので言葉や、説明等間違っているところが あり読みにくいと思います。 fgetc関数の返却値についてのお伺いします。 EOFはファイルの終わり又は、読み込みが失敗すると、返却されるとあります。 ここで、質問なのですが、2つの違いを判断することは可能でしょうか? 私が行った作業は あるファイル内の文字を1文字づつ読み込んで。 文字の種類ごとに指定したbufferferに格納させたいと思っています。 しかし、ファイル内の終端がEOFで終る場合に読み込みエラーの場合と、読み込み終了で 場合分けができない為うまくできません。 #include <stdio.h> #include <ctype.h> char buffer[100]; char *filename="TestFile"; char* main(){ static FILE *fp = NULL; char *p = buffer; int c; if ( fp == NULL ){ if ((fp = fopen( filename, "r" )) == NULL ){ fprintf(stderr,"can not open file %s\n", filename); return ( (char *)NULL ); } } c = fgetc(fp); while(1){ switch(c){ case '\n': case '\0': *p = '\0'; return( buffer); /*以下のcase EOF の時に2通り考えられる*/ case EOF:/*読み込み終了*/ *p = '\0'; return( buffer); /* case EOF:/*読み込みエラー fprintf(stderr, " OPEN _ERROR %s\n", filename); fclose(fp); fp = NULL; return ( (char *)NULL ); */ default: *p = (char)c; p++; } c = fgetc(fp); } } 以上です。 このような場合どうしたらよいのでしょうか?また異なるやり方があればご教授お願いします。 よろしくお願いします。

  • char[]とchar*

    #include<iostream.h> main() { char str1[] = "AB"; char *str2 = "ab"; *(str1+1) = 'C'; *(str2+1) = 'c'; printf("%s\n", str1); printf("%s\n", str2); } このソースの *(str2+1) = 'c'; の所はC++では間違った処理ですか? []かnewなどの変数なら書き換えてよいのは分かりますが、str2はこれでよいのか教えて下さい。

  • C言語について、constの使用方法を教えてください。

    C言語の初心者です。 constの仕様について教えてください。 1.char *const p1; 2.const char *const p2; 以上のうような、指定され方があるとします。 p1,p2では何が違うのでしょうか? 1.では、char型がconst 2.では、p2はconst char型を示すポインタがconst というのまでは理解できたのですが、この結果、p1とp2は何が異なるのでしょうか。 p1,p2はconstされていると思いますが、p2のようにすることでの相違点を教えてください。 調べたのですがすっきりいきません。よろしくお願いします。

  • 44行目: パラメータ '__format' は const signed char * 型として定義されているので int は渡せない(関数 main )

    ☆--------------ソース--------------☆ #include <stdio.h> struct seiseki { int no; char fname[20]; char lname[20]; int val[3]; }seito; int main(void) { int i,total; FILE *fp; FILE *file; struct seiseki seito[20]; char buf[1024]; fp = fopen("in.txt", "r"); i=0; while( fgets(buf, sizeof(buf), fp) ){ struct seiseki tmp; sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]); seito[i++] = tmp; } printf("ID / NAME / 数(1) / 数(2) / 数(3) \n"); for(i = 0; i < 3; i++) { printf("%d / %s %s / %d / %d / %d\n", seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2]); } file = fopen("output.html","w"); fprintf(file ,"<HTML><HEAD></HEAD><BODY><table border=1 bodercolor=black cellspacing=0 width=700>\n"); fprintf(file ,"<tr bgcolor=#FF7575><td>ID</td><td>氏名</td><td>数(1)</td><td>数(2)</td><td>数(3)</td><td>合計点</td><td>平均点</td><td>偏差値</td><td>順位</td></tr>\n"); for(i = 0; i < 3; i++) { fprintf(file ,seito[i].lname); fprintf(file ,seito[i].fname); ☆省略☆ fprintf(file ,seito[i].val[0]); ☆省略☆ } fprintf(file ,"\n</table></BODY></HTML>\n"); return 0; }

  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • 構造体の配列 char *' 型は 'char' 型に変換できない

    大学の課題で構造体の配列の課題が出て、自分で考えてはみたもののわからないところが出たので質問させていただきます。 内容 人物の名前と年齢を入力し、表示するプログラム。 1、typedefを用いて、その構造体にpersonという名前をつける 2、main()にて以下の処理を行う。 (a)person型のサイズNの配列を用意する。 (b)N人分の名前と年齢入力して(a)で用意した配列に格納する。 (c)N人分入力後、名前と年齢を画面に表示する。 #include <stdio.h> #define ninzu 1 typedef struct{ char name[ninzu][20]; int age[ninzu]; } person; int main(void){ int i,ag[ninzu]; char nam[ninzu][20]; for(i=0;i<ninzu;i++){ printf("名前を入力\n"); scanf("%s\n",nam[i]); printf("年齢を入力\n"); scanf("%d\n",&ag[i]); } for(i=0;i<ninzu;i++){ person pro={nam[i],ag[i]}; printf("%s\n",pro.name[i]); printf("%d\n",pro.age[i]); } return(0); } 現在、↑のところまでいったのですが、 for(i=0;i<ninzu;i++){ person pro={nam[i],ag[i]}; printf("%s\n",pro.name[i]); printf("%d\n",pro.age[i]); } の部分の配列の表示の仕方がいまいちわかりません。 現在" 'char *' 型は 'char' 型に変換できない(関数 main() "のエラーが出ています。 わかり難いかもしれませんが、ご指導のほう宜しくお願いいたします。

専門家に質問してみよう