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

C语言如何校验用户输入字符串是否恰好包含两个单词

C语言校验输入恰好为2个单词的可靠实现

你最初用strstr(input, " ")判断空格的方案确实存在逻辑漏洞,无法处理首尾空格、多连续空格的场景,同时你贴的原有代码还存在几个基础语法和逻辑错误:

  • input定义为int类型,无法存储字符串,需要定义为足够长度的字符数组
  • scanf的格式字符串未加引号,且%[^\n]未限制读取长度,存在缓冲区溢出风险
  • 循环判断逻辑仅检查是否存在空格,完全无法校验单词数量

最简便的实现方式不需要手动逐字符遍历字符串,直接利用sscanf的格式匹配特性即可完成校验:%s格式符默认会自动跳过任意数量的空白字符(包含空格、制表符、首尾连续空白),我们可以尝试从输入行中匹配3个字符串:

  • 若成功匹配数为2,且匹配不到第3个字符串,说明输入恰好为2个单词
  • 若匹配数小于2,说明单词数不足
  • 若匹配数大于等于3,说明单词数超出要求

完整可运行代码如下:

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

// 按需调整单单词最大长度即可
#define MAX_WORD_LEN 50
#define MAX_BUF_LEN 2 * MAX_WORD_LEN + 2

int main() {
    char input[MAX_BUF_LEN];
    char w1[MAX_WORD_LEN], w2[MAX_WORD_LEN], extra[MAX_WORD_LEN];
    int match_res;

    do {
        printf("Enter 2 words: ");
        // 安全读取整行输入,限制长度避免溢出
        if (!fgets(input, sizeof(input), stdin)) {
            // 处理EOF等输入异常
            return 1;
        }
        // 清除fgets读取到的行尾换行符
        input[strcspn(input, "\n")] = '\0';

        // 自动跳过所有空白,尝试匹配3个单词
        match_res = sscanf(input, "%s %s %s", w1, w2, extra);
    } while (match_res != 2);

    printf("Input valid. Two words are: %s, %s\n", w1, w2);
    return 0;
}

该方案可以覆盖所有异常输入场景:

  • 自动忽略首尾任意数量的空格、制表符
  • 两个单词之间存在多个连续空格时,不会被误判为有效输入
  • 全空格输入、仅输入1个单词、输入3个及以上单词时,都会触发重新输入
  • 读取输入时做了长度限制,不存在缓冲区溢出的安全问题

内容的提问来源于stack exchange,提问作者Christopher Nathanael Tessy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:18:27