C语言switch语句中使用strtok分割字符串仅输出首个单词的问题
问题分析与解决
你的代码核心问题出在case 'l'分支的while循环里:
while (token != NULL) { printf("%s\n", token); token = strtok(NULL, " "); break; // 这个break直接终止了while循环 }
这条多余的break语句会在第一次循环执行后立刻跳出while循环,导致strtok没有机会继续解析后续的单词,所以只能输出第一个结果。而你在switch外使用strtok时,代码里没有这个break,循环能正常遍历所有分割后的单词,因此可以正常输出全部内容。
修正后的代码
把while循环内的break删掉即可,同时建议在case 'l'分支末尾添加break(避免后续case分支被误执行,这是switch语句的良好编程习惯):
int main(int argc, char *argv[]) { char phrase[256]; printf("type a phrase to examine\n\n"); fgets(phrase, 256, stdin); printf("phrase: %s\n", phrase); int opt; while ((opt = getopt(argc, argv, "l")) != -1) { switch (opt) { case 'l': // prints all words as a list char *token = strtok(phrase, " "); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, " "); // 移除多余的break } break; // 跳出当前case分支 } } return 0; }
额外优化:fgets会把输入的换行符也读入phrase,如果不想让最后一个单词带换行符,可以把分割符改成" \n",即strtok(phrase, " \n"),这样能同时分割空格和换行符。
内容的提问来源于stack exchange,提问作者imaginary flower
相关产品推荐
相关产品推荐

