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
相关产品推荐
相关产品推荐

