コマンドライン引数とsizeof()とstrlenと
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { int i; char *ch = "Hello"; char ar[] = "Hello"; if ( 2 != argc ) { fprintf(stderr, "引数が足りません\n"); exit(-1); } printf("argv[1]: %s\n", argv[1]); printf("sizeof(argv[1]): %d\n", sizeof(argv[1])); printf("strlen(argv[1]): %d\n", strlen(argv[1])); for ( i = 0; i < sizeof(argv[1]); ++i ) if ( '\0' == argv[1][i] ) printf("argv[1][%d]に'\\0'を発見しました.\n", i); puts(""); printf("ch: %s\n", ch); printf("sizeof(ch): %d\n", sizeof(ch)); printf("strlen(ch): %d\n", strlen(ch)); for ( i = 0; i < sizeof(ch); ++i ) if ( '\0' == ch[i] ) printf("ch[%d]に'\\0'を発見しました.\n", i); puts(""); printf("ar[]: %s\n", ar); printf("sizeof(ar): %d\n", sizeof(ar)); printf("strlen(ar): %d\n", strlen(ar)); for ( i = 0; i < sizeof(ar); ++i ) if ( '\0' == ar[i] ) printf("ar[%d]に'\\0'を発見しました.\n", i); puts(""); return 0; }
- 入力
./a.out Hello
- 出力
argv[1]: Hello sizeof(argv[1]): 4 strlen(argv[1]): 5 ch: Hello sizeof(ch): 4 strlen(ch): 5 ar[]: Hello sizeof(ar): 6 strlen(ar): 5 ar[5]に'\0'を発見しました.
- 結論
・コマンドライン引数は文字リテラルになっている
・文字リテラルはナル文字がない
・文字リテラルはポインタで指されているため,sizeof()は4byte
・strlenは文字数なので文字リテラルでも配列でも変わらない(ただし,返却値にナル文字を含まない)