使用 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
如果我注释掉 "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