如何实现C语言函数判断字符串数字是否严格递增?(含特殊返回规则)
问题:判断字符串中数字是否严格递增的C语言函数实现
需求回顾
- 编写C语言函数,判断给定字符串中的数字是否严格递增(每个数字都大于前一个)
- 返回规则:
- 严格递增返回
1 - 不满足严格递增返回
0 - 字符串中无数字返回
-1
- 严格递增返回
- 限制:不能使用数组或创建新字符串
原代码存在的问题
cifre函数逻辑错误:
该函数仅检查字符串的第一个字符是否为数字,没有遍历整个字符串,无法正确判断字符串中是否存在任何数字。比如字符串"abc123"会被错误判定为无数字。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; }
代码说明
has_digits函数:遍历整个字符串,只要找到一个数字就返回1,遍历结束未找到则返回0,解决了原cifre函数的逻辑错误。check_strictly_increasing函数:- 先调用
has_digits判断是否有数字,无则返回-1 - 遍历字符串时,先找到第一个数字作为基准值
- 后续每遇到一个数字,就和前一个数字比较:如果当前数字小于等于前一个,直接返回0
- 遍历完成后所有数字都满足严格递增,返回1
- 先调用
- 使用
(unsigned char)转换传入isdigit的参数,避免因字符为负(如扩展ASCII)导致的未定义行为。
测试用例验证
- 输入
"a1b2c3d"→ 返回1 - 输入
"a1b3c3d"→ 返回0 - 输入
"abcdef"→ 返回-1 - 输入
"9876"→ 返回0 - 输入
"13579"→ 返回1
内容的提问来源于stack exchange,提问作者user20941117
相关产品推荐
相关产品推荐

