0

変数 input2 が文字列の最初の単語のみを出力していることに気付きました。これがプログラムの残りの部分で問題を引き起こしています (つまり、名詞が正しく出力されていません)。なぜこれが起こっているのかについての洞察をいただければ幸いです。

int main(int argc, char* argv[]){

    char *input = strtok(argv[1], " \"\n");
    //printf("%s\n", input);
    int position;
    int check = 0;
    int first = 1;
    while (input != NULL) {
        position = binary_search(verbs, VERBS, input);
        //printf("%s\n", input);
        //printf("%d\n", position);
        if (position != -1){
            if (first){
                printf("The verbs were:");
                first = 0;
                check = 1;
            }
            printf(" %s", input);
        }
        input = strtok(NULL, " ");
    }
    if (check == 1){
        printf(".\n");
    }
    if (check == 0){
        printf("There were no verbs!\n");
    }

    char *input2 = strtok(argv[1], " \"\n");
    //printf("%s\n", input2);
    int position2;
    int check2 = 0;
    int first2 = 1;

    while (input2 != NULL) {
        position2 = binary_search(nouns, NOUNS, input2);
        //printf("%s\n", input2);
        //printf("%d\n", position2);
        if (position2 != -1){
            if (first2){
                printf("The nouns were:");
                first2 = 0;
                check2 = 1;
            }
            printf(" %s", input2);
        }
        input2 = strtok(NULL, " ");
    }
    if (check2 == 1){
        printf(".\n");
    }
    if (check2 == 0){
        printf("There were no nouns!\n");
    }

        return 0;
}
4

1 に答える 1

6

strtok()ソースとして渡す文字列を変更するため、2 回目の呼び出しstrtok()argv[1]の元の値には作用せずargv[1]、最初のトークンのみに作用します。

次のようなことをしたいかもしれません:

char* s = strdup(argv[1]);

s文字列oに作用し、argv[1]変更されないままになります。後でもう一度処理できます。ただし、使い終わったら、複製された文字列のメモリを解放する必要があります。

于 2013-05-29T18:39:42.260 に答える