You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:15:03