プロが教えるわが家の防犯対策術!

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

A 回答 (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 );
・以上。おわり。
    • good
    • 1

VisualC++のコンパイラでコンパイルしたら


その部分はWarningにはなりましたがErrorではなかったです。
C++ならErrorなのでC++としてコンパイルしたのかな?


修正ですが、
> char *p = ALPH;
> char *q = ALPH;

 const char *p = ALPH;
 const char *q = ALPH;
と直せば良さそうです。
    • good
    • 1

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

    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています