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

如何在C语言中验证字符串是否为单逗号分隔的整数/符号列表?

C语言字符串格式验证函数实现

核心思路

要满足你的验证规则,我们可以按以下步骤逐字符遍历字符串:

  1. 先跳过开头所有空白字符,若直接遇到逗号,判定无效。
  2. 循环处理每个元素:
    • 验证当前位置的字符属于合法元素(整数:可选负号+数字序列;标识符:非数字开头的非空白/非逗号字符序列)。
    • 跳过当前元素的所有字符,直到遇到空白或逗号。
    • 跳过后续所有空白,若遇到逗号:
      • 跳过逗号后再跳过空白,若此时已到字符串末尾,判定无效(逗号后无元素)。
      • 否则继续处理下一个元素。
    • 若遍历到字符串末尾,判定有效。
  3. 全程拦截「连续逗号」「逗号开头/结尾」这类非法情况。

完整实现代码

#include <stdbool.h>
#include <ctype.h>

// 跳过连续空白字符,返回指向第一个非空白字符的指针
static const char* skip_whitespace(const char* str) {
    while (*str != '\0' && isspace((unsigned char)*str)) {
        str++;
    }
    return str;
}

// 验证当前位置是否为合法元素,并移动指针到元素末尾
static bool validate_element(const char** str) {
    const char* p = *str;
    
    // 空元素(比如两个逗号之间无内容)
    if (*p == '\0' || *p == ',') {
        return false;
    }
    
    // 处理整数的负号
    if (*p == '-') {
        p++;
        // 负号后必须跟数字
        if (!isdigit((unsigned char)*p)) {
            return false;
        }
        // 跳过所有数字
        while (isdigit((unsigned char)*p)) {
            p++;
        }
        *str = p;
        return true;
    }
    
    // 处理数字开头的整数
    if (isdigit((unsigned char)*p)) {
        while (isdigit((unsigned char)*p)) {
            p++;
        }
        *str = p;
        return true;
    }
    
    // 处理标识符(非数字开头,非空白/非逗号的字符序列)
    if (isalpha((unsigned char)*p)) {
        while (*p != '\0' && !isspace((unsigned char)*p) && *p != ',') {
            p++;
        }
        *str = p;
        return true;
    }
    
    // 其他非法字符
    return false;
}

// 主验证函数
bool validateString(const char* str) {
    if (str == NULL) {
        return false;
    }
    
    // 跳过开头空白
    str = skip_whitespace(str);
    if (*str == '\0') {
        return false; // 空字符串无效
    }
    if (*str == ',') {
        return false; // 开头不能是逗号
    }
    
    while (*str != '\0') {
        // 验证当前元素
        if (!validate_element(&str)) {
            return false;
        }
        
        // 跳过元素后的空白
        str = skip_whitespace(str);
        
        // 遇到逗号,处理下一个元素
        if (*str == ',') {
            str++;
            // 跳过逗号后的空白
            str = skip_whitespace(str);
            // 逗号后不能直接到结尾,也不能是另一个逗号
            if (*str == '\0' || *str == ',') {
                return false;
            }
        }
        // 否则到结尾,循环结束
    }
    
    return true;
}

// 测试示例
#include <stdio.h>
int main() {
    const char* valid_cases[] = {
        "6, -9, 10",
        " 3,    5, len",
        "123",
        "  -456  ",
        "abc, def123, -789"
    };
    const char* invalid_cases[] = {
        ",6 ,7 ,6",
        "10, 4, , 3",
        "3, len, 4,",
        "",
        "   ",
        "abc,,def",
        "-abc",
        "123, ,456"
    };
    
    printf("测试有效用例:\n");
    for (int i = 0; i < sizeof(valid_cases)/sizeof(valid_cases[0]); i++) {
        printf("\"%s\": %s\n", valid_cases[i], validateString(valid_cases[i]) ? "有效" : "无效");
    }
    
    printf("\n测试无效用例:\n");
    for (int i = 0; i < sizeof(invalid_cases)/sizeof(invalid_cases[0]); i++) {
        printf("\"%s\": %s\n", invalid_cases[i], validateString(invalid_cases[i]) ? "有效" : "无效");
    }
    
    return 0;
}

代码说明

  1. skip_whitespace:辅助函数,快速跳过所有空白字符,简化主逻辑的空白处理。
  2. validate_element:验证当前位置的字符是否构成合法元素:
    • 支持带负号的整数,负号后必须跟数字。
    • 支持纯数字整数。
    • 支持字母开头的标识符(如示例中的len),后续可跟任意非空白/非逗号字符。
  3. validateString:主函数,按思路遍历字符串,拦截所有非法情况:
    • 提前处理空指针、空字符串、开头逗号的情况。
    • 每处理完一个元素后,检查后续是否为逗号,若为逗号则确保后面还有有效元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:23:13