if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 )
^ ^ ^
これはおそらく、argv[i] 定数の最初の部分文字列が次の値に等しく、その長さであることを確認 cascade_opt
しcascade_opt_len
ますcascade_opt
次の行で:
cascade_name = argv[i] + cascade_opt_len;
^ points to string after sub string in `cascade_opt`
これは、文字列を解析する単なる方法です:
コードで何が起こるかをより明確に理解するために、コードを書きました。
int main (int argc, char* argv[]){
char *cascade_name = NULL;
char* cascade_opt = "nameIs";
int cascade_opt_len = strlen(cascade_opt);
int i = 1;
if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 )
cascade_name = argv[i] + cascade_opt_len;
printf("\ncascade_name is: %s ", cascade_name);
printf("\n");
return 0;
}
実行してみましょう (ただし、コードでは i=1 に注意してください):
~$ ./a.out nameIsGrijesh
cascade_name is: Grijesh
if ステートメントcascade_name
が argv[1] の最後の部分文字列 'Grijesh' を指すようになりました。
このコードをループで拡張して、各入力コマンド ライン引数を解析します。
int main (int argc, char* argv[]){
char *cascade_name = NULL;
char* cascade_opt = "nameIs";
int cascade_opt_len = strlen(cascade_opt);
int i = 1;
for(i=1; i < argc; i++){
if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 ){
cascade_name = argv[i] + cascade_opt_len;
printf("\ncascade_name is: %s ", cascade_name);
}
}
printf("\n");
return 0;
}
コードの実行内容を確認します。
grijesh@hp:~$ ./a.out nameIsGrijesh nameIsB.rabbit mynameIsXX nameIsStackOverflow
cascade_name is: Grijesh
cascade_name is: B.rabbit
cascade_name is: StackOverflow
なぜXX
印刷されないのか分かりますか?
編集
私== '='
の3番目のコードは役に立ちます:出力を理解してみてください:
int main (int argc, char* argv[]){
char *cascade_name = NULL;
char* cascade_opt = "nameIs";
int cascade_opt_len = strlen(cascade_opt);
int nested_cascade_opt_len = strlen(cascade_opt);
int i = 1;
for(i=1; i < argc; i++){
if( strncmp( argv[i], cascade_opt, cascade_opt_len) == 0 ){
cascade_name = argv[i] + cascade_opt_len;
printf("\ncascade_name is: %s ", cascade_name);
}
if( argv[i][nested_cascade_opt_len] == '=' ){
cascade_name = argv[i] + nested_cascade_opt_len + 1;
printf("\nfom second potion is: %s ", cascade_name);
}
}
printf("\n");
return 0;
}
出力は次のとおりです。
:~$ ./a.out nameIsGrijesh nameIsB.rabbit myname=XX nameIsStackOverflow
cascade_name is: Grijesh
cascade_name is: B.rabbit
fom second option is: XX
cascade_name is: StackOverflow