在C语言开发中,经常需要对字符串进行各类处理操作,删除字符串中的数字字符就是非常实用的一个场景。比如处理用户输入的混杂了数字的文本、清洗日志中的冗余数字信息等,都可以通过对应的逻辑实现。

实现思路分析
要删除字符串中的数字字符,核心逻辑可以分为三步:
- 遍历原始字符串的每一个字符
- 判断当前字符是否为数字字符,也就是判断字符是否在'0'到'9'的范围内
- 将非数字的字符保留下来,重新组成新的字符串,数字字符则直接跳过
判断字符是否为数字有两种常用方式,一种是直接比较字符的ASCII值,另一种是使用C标准库中的<ctype.h>头文件提供的isdigit函数,后者可读性和通用性更好。
基础循环实现方式
这种方式使用两个下标变量,一个用于遍历原字符串,一个用于记录新字符串的当前位置,代码如下:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
// 删除字符串中的数字字符函数
void remove_digits(char *str) {
int i = 0; // 原字符串遍历下标
int j = 0; // 新字符串记录下标
// 遍历原字符串直到遇到结束符
while (str[i] != ' ') {
// 判断当前字符不是数字
if (!isdigit((unsigned char)str[i])) {
str[j] = str[i];
j++;
}
i++;
}
// 给新字符串添加结束符
str[j] = ' ';
}
int main() {
char test_str[100] = "a1b2c3d4e5f6g7";
printf("原始字符串: %sn", test_str);
remove_digits(test_str);
printf("删除数字后的字符串: %sn", test_str);
return 0;
}
上述代码中,isdigit函数会判断传入的字符是否为十进制数字字符,如果是则返回非零值,否则返回0。我们将原字符串中非数字的字符依次放到前面位置,最后添加字符串结束符,就完成了数字删除操作。
指针方式实现
使用指针操作可以让代码更简洁,适合熟悉指针用法的开发者,实现逻辑和循环方式一致:
#include <stdio.h>
#include <ctype.h>
// 指针方式删除数字字符
void remove_digits_ptr(char *str) {
char *src = str; // 源指针,遍历原字符串
char *dst = str; // 目标指针,记录非数字字符位置
while (*src != ' ') {
if (!isdigit((unsigned char)*src)) {
*dst = *src;
dst++;
}
src++;
}
*dst = ' ';
}
int main() {
char test_str[100] = "hello123world456";
printf("原始字符串: %sn", test_str);
remove_digits_ptr(test_str);
printf("删除数字后的字符串: %sn", test_str);
return 0;
}
注意事项
在使用isdigit函数时,需要注意传入的参数要转换为unsigned char类型,否则如果传入的字符是负数(比如某些扩展字符集的情况),可能会导致未定义行为。
另外,上述两种实现方式都是在原字符串上进行修改,不会额外开辟新的字符串空间,空间复杂度为O(1),适合处理长度适中的字符串。如果需要保留原字符串,可以先拷贝一份再进行处理。
扩展思考
掌握了删除数字字符的方法后,我们可以很容易扩展出删除其他类型字符的功能,比如删除字母、删除空格等,只需要修改判断条件即可。例如删除所有小写字母,只需要把判断条件改为islower((unsigned char)*src)即可,这类思路可以应用到很多字符串筛选场景中。