アプリ版:「スタンプのみでお礼する」機能のリリースについて

fopenの定義をいかに記します。

FILE *fopen(const char *filename, const char *mode);

filenameはconstで定義されることを要求されております。
が以下の内容はコンパイルできます。

int main(int argc, char** argv)
{
FILE* ftemp;
ftemp = fopen( argv[1], "r" );
}

この場合、argvはconstではありません。
constの必要性ってありますか?

A 回答 (5件)

>ちなみに"TEST.TXT"がリテラルってことでしょうか?



そうとも言い切れませんが、一般的には「そう」ですね。

ちょっと乱暴で不正確ですが、簡単に言えば「ROM領域や、リードオンリーでライトプロテクトされたメモリ領域など、書き込みできないメモリに配置された文字列も指定可能」って事です。
    • good
    • 0
この回答へのお礼

わっかりました~!
理解が深まりました!

お礼日時:2014/06/10 16:53

それはちょっと乱暴すぎませんかね>#3.



任意の型 T に対し T * は const T * に自動変換可能だが逆は自動変換できない. 結果として, 仮引数の const char * に対応する実引数は char * でも const char * でも構わないのに対し, 仮引数が char * であるなら対応する実引数は char * でなければならない (const char * は不可).

さて,
char buf[256];
char *p = buf;
const char *cp = buf;
strcpy(buf, "abc");
strcpy(p, "abc");
strcpy(cp, "abc");
とやったときにどれが OK でどれが NG でしょうか?
    • good
    • 0
この回答へのお礼

char *strcat(char *s1, const char *s2);

ですので、
strcpy(buf, "abc"); OK
strcpy(p, "abc");  OK
strcpy(cp, "abc");  NG

ですね!仮引数の const char * に対応する実引数は char * でも const char * でも構わないのですか!
ありがとうございます!理解が深まりました!

お礼日時:2014/06/10 16:02

コンパイルが通って、かつ、


思ったとおりに実行できれば、
それでよし。

何かのコードを書いたら、
まずは自分で実験してみましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます!
御意にございます。

お礼日時:2014/06/10 16:04

FILE *fopen(const char *filename, const char *mode);



これの意味は「fopenは、fopen関数の中で、filenameやmodeが指す文字列を書き換えませんよ」って意味です。

つまり

fp = fopen("TEST.TXT","wt");

などのような「リテラルな値」を指定可能である、と言う事を意味します。

一方

char *strcat(char *s1, const char *s2);

は「s1が指す文字列はstrcatの関数内で書き換える可能性があるぞ。だけどs2が指す文字列はstrcatの関数内で書き換えないぞ」って事を意味します。

つまり

char buf[256];
buf[0]='\0';
strcat(buf,"abc");

は可能だけど

const char *ptr = "";
strcat(ptr,"abc");

はやっちゃ駄目、って事を意味しています。
    • good
    • 0
この回答へのお礼

fp = fopen("TEST.TXT","wt");

などのような「リテラルな値」を指定可能である、と言う事を意味します

なるほど!リテラルな値が使えることを意味しているのですね!ちなみに"TEST.TXT"がリテラルってことでしょうか?
あほですいません。

お礼日時:2014/06/10 16:03

constにしておけば、


不用意に書き換えようとすると
何かまずいことが起きるかも、
というくらいのものです。

当該のコードでは、argvにconstを付ける必要性はありません。

なお、argv[1]にアクセスする際は、
argcが2以上であることが必要です。
そのコードでは、実行時に何も引数を与えないままだと、
いきなり落ちてしまうことでしょう。
    • good
    • 0
この回答へのお礼

早速のご返信ありがとうございます。
それでは以下の場合どうですか。

FILE*ai;
charbuff[16];
CStringA;

A=_T("D:\\1.txt");
strcpy( buff, CStringA(A) );

ai=fopen(buff,"r");

A=_T("D:\\2.txt");
strcpy( buff, CStringA(A) );
ai=fopen(buff,"r");

buffは書き換わりますが、コンパイル通りますね。
それともこれは不用意な書き換わりではないので
コンパイルが通るのでしょうか?

お礼日時:2014/06/10 14:33

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