C语言使用strtok分割字符串时用户输入场景仅返回首个令牌的原因?
问题根因
问题出在输入语句scanf("%s", str)的特性上:%s格式符的读取规则是遇到空格、换行、制表符等空白字符就自动终止读取,只把空白符之前的内容写入目标数组。
你输入10 20 30时,scanf只会把第一个空格前的10存入str,后续的20、30根本没有被写入目标字符串,strtok自然只能分割出10这一个元素。
而你直接初始化字符串的版本可以正常运行,是因为初始化操作完整把"10 20 30"全量写入了str数组,不存在读取截断的问题。
修复方案
如果要读取包含空格的整行输入,可将scanf替换为fgets函数读取整行输入:
#include <stdio.h> #include <string.h> int main() { char str[100]; printf("Enter the numbers.\n"); // fgets参数分别为:目标数组、数组最大长度、输入流 fgets(str, sizeof(str), stdin); // 可选操作:去除fgets读取到的末尾换行符 str[strcspn(str, "\n")] = '\0'; char* token = strtok(str, " "); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, " "); } return 0; }
内容的提问来源于stack exchange,提问作者sivaram
相关产品推荐
相关产品推荐

