ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

C/C++でコマンドライン引数の文字数が取得できない

結論から言うとsizeof()じゃなくてstrlen()を使いましょうという話です.

x86(32bit)環境で以下のようなプログラムをビルドして実行すると、いかなるコマンドライン引数であっても「size:4」と表示されます.

#include<stdio.h>

int main(int argc, char** argv){
    if(argc==1){
         return 1;
    }
    printf("size:%d\n",sizeof(argv[1]));
    return 0;
}



これは コマンドライン引数は配列ではなくchar型へのポインタのポインタ として渡されるので sizeof(argv[1])はポインタのサイズを返す ためです. 文字列の長さを取得したい場合はstrlen()を使用しましょう. strlen()はナル文字を除いた文字数を返してくれます. したがってコマンドライン引数の文字列を取得したければ以下のようなコードにしましょう.

#include<stdio.h>
#include<string.h>

int main(int argc, char** argv){
    if(argc==1){
        return 1;
    }
    printf("size:%d\n", strlen(argv[1]));
    return 0;
}



strlen()を使用するときの注意点として、(検索対象の文字列内にナル文字がないと)ナル文字を見つけるまで永遠に検索してしまうことがあります. 以下のようなコードを実行すると文字列の外まで検索が行われていることが分かります. まあこれはstrlen()に限らずC/C++の文字列全般に言えることですが.

#include<stdio.h>
#include<string.h>

int main(int argc, char** argv){
    char buff1[]={'A','B','A','B','A','B','A','B'};    // 8文字
    char buff2[]={'A','B','A','B','A','B','A','B'};    // 8文字
    printf("strlen of buff1:%d\n",strlen(buff));      // strlen of buff1:12
    printf("strlen of buff2:%d\n",strlen(buff2));     // strlen of buff2:20
    return 0;
}

参考

programming-place.net