重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

固定文字列の長さはどのように書いたらよいのでしょう?

"====END====" の文字列長は11ですので、
strlen(ENDMARK); と記述すると、実行時に計算して11を得るコードが生成されますよね。
これを、コンパイル時に数字11に置き換えてくれる記載方法が思いつきません。

つまり、以下のコードでは、strlen(ENDMARK)なので、
 実行時に文字列長を計算するコード
になってしまいます。
これを、コンパイル時に計算して定数11に置き換えるようなコードを書きたいのです。
strlen(ENDMARK)と記載した部分を、どのように書いたらよいのでしょうか?

単純に11に置き換えてしまうと、#define ENDMARK "====END===="を修正した場合に整合性が取れなくなることがあり避けたいのです。
よろしくお願いします。

#define ENDMARK "====END===="

gets(buf);
if( strncmp(buf, ENDMARK, strlen(ENDMARK)) == 0 ) {
:

A 回答 (2件)

sizeof(ENDMARK) とすると1バイト大きい12が得られます。


11が望みなので、
if( strncmp(buf, ENDMARK, sizeof(ENDMARK)-1) == 0 ) { とするか

#define ENDMARKLEN (sizeof(ENDMARK)-1) として
if( strncmp(buf, ENDMARK, ENDMARKLEN) == 0 ) { とするか
のどちらかでよいかと。
    • good
    • 0
この回答へのお礼

>if( strncmp(buf, ENDMARK, sizeof(ENDMARK)-1) == 0 ) { とするか
ありがとうございます、そのようにしました。

sizeofはメモリ使用量を計るものなので、結果、文字数も判るわけですね。
判ってしまえば、当たり前ですね。
ありがとうございました。

お礼日時:2015/11/16 13:52

そうしたい理由が疑問ですが、


sizeof (ENDMARK) - 1
で、コンパイル時に定数へ変換されます。
-1 は文字列の最後には NULL があるためです。
    • good
    • 0
この回答へのお礼

sizeof (ENDMARK) - 1
なるほど。
ありがとうございます。

>そうしたい理由が疑問ですが、
実行時に計算するのが「美しくない」と感じるからです。

富豪的プログラミングができない貧乏性なので・・・
http://www.pitecan.com/fugo.html

お礼日時:2015/11/16 13:47

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