使用 strtok 时出现段错误

Segfault when using strtok

如果我注释掉 "printPigWord(temp);" 这个程序工作正常,它会毫无问题地标记单词,但是一旦我把那行加回去,它就不会做下一个标记。它将打印 1 "pig latin" 个单词和 returns 回到 main,然后我得到一个分段错误。我不知道是什么原因造成的。

int main (void){
    char phrase[50];
    char *token, c, temp[20];
    int i=0;

    printf("Enter a phrase to be translated into pig latin: ");
    c = getchar();
    while( c != '\n'){
        phrase[i++] = c;
        c = getchar();
    }
    phrase[i] = '[=10=]';

    token = strtok(phrase, " ");

    while(token != NULL){
        strcpy(temp, token);
        printPigWord(temp);
        token = strtok(NULL, " ");

    }

    return 0; /*Successful completion*/
}

void printPigWord(char token[20]){
    char first[1];
    char temp[20];

    /*save first letter */
    strncpy(first, token, 1);
    first[1] = '[=10=]';

    /*add ay to end of first letter*/
    strcat(first, "ay");

    /*remove first letter of token*/
    strcpy(temp, &token[1]);

    /*add first letter+ay to end of token*/
    strcat(temp, first);

    /*print out token*/
    printf("%s\n", temp);

}

哼。第一个只有一个字符长。你不能将东西连接到它,否则你会覆盖其他东西(例如临时)...

first[1] = '[=10=]'; // already out of boundes

/*add ay to end of first letter*/
strcat(first, "ay"); // again, first can carry only one char