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

C++按空格分割字符串问题:输入完整句子为何仅输出"W3"?

排查输入句子仅处理第一个单词的问题

嘿,我来帮你揪出这个问题的根源!从你说的现象——输入完整句子"we are going to have fun in school"却只输出"W3"——来看,大概率是两个常见问题中的一个:

1. 输入读取只拿到了第一个单词

最常见的坑就是用了scanf("%s")来读取输入。这个函数的特性是遇到空格、换行等空白字符就停止读取,所以它只会把第一个单词"we"读进你的变量里,后面的内容直接被忽略了。

举个典型的错误代码例子:

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

int main() {
    char input[100];
    scanf("%s", input); // 这里只读到"we"就停了
    // 处理逻辑:首字母大写 + 单词长度
    printf("%c%d", toupper(input[0]), strlen(input));
    return 0;
}

运行这段代码输入你的句子,必然只会输出W3。

修复方法:读取整行输入

如果你要处理整句话里的所有单词,应该用fgets()来读取完整的一行(包括空格),然后再分割成单词逐个处理。比如:

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

int main() {
    char sentence[200];
    // 读取整行输入,注意fgets会把换行符也读进来
    fgets(sentence, sizeof(sentence), stdin);
    
    // 用strtok分割单词,分隔符是空格和换行
    char *word = strtok(sentence, " \n");
    while (word != NULL) {
        // 输出每个单词的首字母大写+长度
        printf("%c%d ", toupper(word[0]), strlen(word));
        word = strtok(NULL, " \n"); // 继续取下一个单词
    }
    return 0;
}

这段代码运行后,输入你的句子会输出:W3 A2 G5 T2 H3 F3 I2 S6。

2. 缺少遍历所有单词的循环逻辑

如果你的代码已经读取了整行,但还是只输出第一个单词的结果,那可能是你只处理了一次就退出了,没有用循环遍历所有拆分出来的单词。比如代码里只处理了strtok返回的第一个word,没有写while循环继续处理后续单词。

修复方法:添加循环遍历

确保你有一个循环(比如while),直到所有单词都被处理完才停止,就像上面的示例代码那样。


内容的提问来源于stack exchange,提问作者Nico van Bentum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:25:14