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

如何在C语言中逐词解析标准输入(STDIN)字符串?

解决C程序读取空白分隔的命令与参数问题

问题原因解析

  1. scanf("%s")仅读取第一个单词:%s格式说明符会在遇到空白字符(空格、换行、制表符)时停止读取,所以输入ATTACK 50 30时,只会把ATTACK存入缓冲区,剩下的50 30留在输入流中。
  2. 错误比较scanf返回值与"\0":scanf的返回值是成功读取的变量个数(整数类型),而"\0"是字符串字面量,本质是指向字符的指针。将整数和指针直接比较,会触发"指针与整数比较"的编译错误。正确的终止判断应该是检查返回值是否为EOF(输入结束)或小于预期读取的项数。

正确实现方式

方法1:循环调用scanf读取每个单词

利用scanf("%s")自动跳过前导空白的特性,循环读取直到输入结束:

#include <stdio.h>

int main() {
    char token[100];
    // 循环读取每个空白分隔的单词,直到输入结束(返回EOF)
    while (scanf("%99s", token) != EOF) {
        printf("%s\n", token);
    }
    return 0;
}
  • 注意:使用%99s而非%s,避免输入长度超过token数组大小导致缓冲区溢出。
  • 输入ATTACK 50 30后,会逐行输出ATTACK、50、30。

方法2:读取整行后拆分(适合需要保留行结构的场景)

先用fgets读取整行输入,再用strtok按空白字符拆分:

#include <stdio.h>
#include <string.h>

int main() {
    char line[256];
    // 读取整行输入(包含空格)
    if (fgets(line, sizeof(line), stdin) != NULL) {
        // 首次调用strtok传入目标字符串,指定分隔符为空白类字符
        char *token = strtok(line, " \t\n");
        while (token != NULL) {
            printf("%s\n", token);
            // 后续调用传入NULL,继续拆分剩余字符串
            token = strtok(NULL, " \t\n");
        }
    }
    return 0;
}
  • strtok会修改原字符串(将分隔符替换为'\0'),如果需要保留原始输入内容,需先复制一份字符串再拆分。

内容的提问来源于stack exchange,提问作者Abhi Rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:01:16