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

如何实现C语言函数判断字符串数字是否严格递增?(含特殊返回规则)

问题:判断字符串中数字是否严格递增的C语言函数实现

需求回顾

  • 编写C语言函数,判断给定字符串中的数字是否严格递增(每个数字都大于前一个)
  • 返回规则:
    • 严格递增返回 1
    • 不满足严格递增返回 0
    • 字符串中无数字返回 -1
  • 限制:不能使用数组或创建新字符串

原代码存在的问题

  1. cifre函数逻辑错误:
    该函数仅检查字符串的第一个字符是否为数字,没有遍历整个字符串,无法正确判断字符串中是否存在任何数字。比如字符串"abc123"会被错误判定为无数字。

  2. srce函数逻辑混乱:

    • 初始值broj=1不合理,应该先找到第一个数字作为基准值,而非固定为1
    • 比较逻辑完全颠倒:需要判断当前数字是否大于前一个数字,但原代码判断的是*s < broj
    • istina的赋值逻辑错误,初始值和条件触发后的赋值不符合需求(原需求中1代表递增成立,0代表不成立)
    • 遇到符合条件的数字后未更新broj,也未处理完整的数字遍历逻辑

修正后的代码

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

// 读取输入字符串的函数(保留原实现)
void unesi(char niz[], int velicina)
{
    char znak = getchar();
    if (znak == '\n')
        znak = getchar();

    int i = 0;
    while (i < velicina - 1 && znak != '\n')
    {
        niz[i] = znak;
        i++;
        znak = getchar();
    }
    niz[i] = '\0';
}

// 判断字符串中是否存在数字
int has_digits(const char *s)
{
    while (*s != '\0')
    {
        if (isdigit((unsigned char)*s))
            return 1; // 存在数字
        s++;
    }
    return 0; // 无数字
}

int check_strictly_increasing(const char *s)
{
    // 先检查是否有数字
    if (!has_digits(s))
        return -1;

    char prev_digit = 0;
    int first_digit_found = 0;

    while (*s != '\0')
    {
        if (isdigit((unsigned char)*s))
        {
            if (!first_digit_found)
            {
                // 记录第一个数字作为基准
                prev_digit = *s;
                first_digit_found = 1;
            }
            else
            {
                // 当前数字必须大于前一个数字,否则直接返回0
                if (*s <= prev_digit)
                {
                    return 0;
                }
                prev_digit = *s; // 更新前一个数字
            }
        }
        s++;
    }

    // 所有数字都满足严格递增
    return 1;
}

int main() {
    char a[100];
    unesi(a, 100);
    printf("%d", check_strictly_increasing(a));
    return 0;
}

代码说明

  1. has_digits函数:遍历整个字符串,只要找到一个数字就返回1,遍历结束未找到则返回0,解决了原cifre函数的逻辑错误。
  2. check_strictly_increasing函数:
    • 先调用has_digits判断是否有数字,无则返回-1
    • 遍历字符串时,先找到第一个数字作为基准值
    • 后续每遇到一个数字,就和前一个数字比较:如果当前数字小于等于前一个,直接返回0
    • 遍历完成后所有数字都满足严格递增,返回1
  3. 使用(unsigned char)转换传入isdigit的参数,避免因字符为负(如扩展ASCII)导致的未定义行为。

测试用例验证

  • 输入"a1b2c3d" → 返回1
  • 输入"a1b3c3d" → 返回0
  • 输入"abcdef" → 返回-1
  • 输入"9876" → 返回0
  • 输入"13579" → 返回1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:30:43