如何在C语言中逐词解析标准输入(STDIN)字符串?
解决C程序读取空白分隔的命令与参数问题
问题原因解析
scanf("%s")仅读取第一个单词:%s格式说明符会在遇到空白字符(空格、换行、制表符)时停止读取,所以输入ATTACK 50 30时,只会把ATTACK存入缓冲区,剩下的50 30留在输入流中。- 错误比较
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
相关产品推荐
相关产品推荐

