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

C语言仅用strlen实现字符串非数字字符过滤函数问题求解

问题背景

需要实现一个过滤字符串非数字字符的函数,实现过程仅允许调用strlen函数:输入字符串"a4n55"时,预期输出为"455"。现有初步编写的代码(代码中printf语句仅作测试使用)存在逻辑错误,需要排查修正。
原有实现代码如下:

void filterNonDigitCharacters(char inData[], char outData[])
{

    // create variables
    int stringLen, i, j;
    
    // get string length
    stringLen = strlen(inData);

    printf("Before filter: %s\n", inData);
    // loop across string
    for(i = 0; i < stringLen; i++)
    {
        // check if char is a number        
        if(inData[i] >= '0' && inData[i] <= '9')
        {
            outData[i] = inData[i];         
            printf("Filtering number: %c at location: %d\n", outData[i] , i);
        }
        // check if char is a letter
        else if(inData[i] >= 'a' && inData[i] <= 'z')
        {
            j = i;
            printf("Letter found : %c at index: %d\n", inData[i], i);
            outData[j] = inData[i + 1];
            printf("Moving number down: %c\n", outData[j]);
        }
    }   
    outData[i] = inData[i]; 
    printf("New String: %s\n", outData);
}
原有代码问题点
  • 输出数组下标复用错误:直接用遍历输入串的下标i给输出数组赋值,遇到非数字字符时输出位置不会顺延,会导致输出串出现空槽、字符错位、内容重复。
  • 非数字分支逻辑完全错误:遇到字母时直接读取inData[i+1]写入输出,既没有判断i+1是否超出字符串长度导致越界,还会跳过后续字符的校验,甚至把非数字内容错误写入结果。
  • 字符串终止符位置错误:循环结束后把终止符放在输出数组的i位置(等于输入串长度),但由于前面写入位置错位,会导致输出串前面残留未初始化的垃圾值,或者结果被意外截断。
  • 非数字字符覆盖不全:仅判断了小写字母场景,其他非数字字符(大写字母、符号、空格等)不会被处理,会直接残留在输出数组对应位置。
修正后代码
void filterNonDigitCharacters(char inData[], char outData[])
{
    int stringLen, i, j;
    
    // 获取输入字符串长度
    stringLen = strlen(inData);
    printf("Before filter: %s\n", inData);

    // 单独用j记录输出数组的当前写入位置,初始从0开始
    j = 0;
    for(i = 0; i < stringLen; i++)
    {
        // 仅当当前字符为数字时,才写入输出数组
        if(inData[i] >= '0' && inData[i] <= '9')
        {
            outData[j] = inData[i];
            printf("Filtering number: %c at input index: %d, output index: %d\n", outData[j], i, j);
            // 写入成功后,输出数组下标后移一位
            j++;
        }
        else
        {
            // 所有非数字字符直接跳过,不做任何写入操作
            printf("Non-digit character found: %c at index: %d, skip\n", inData[i], i);
        }
    }
    // 在输出串的实际末尾补字符串终止符'\0',保证字符串合法
    outData[j] = '\0';
    printf("New String: %s\n", outData);
}
实现逻辑说明
  • 输入、输出数组使用独立下标遍历:i负责走完整个输入串,j只在写入数字字符时后移,从根源上避免位置错位问题。
  • 去掉了原有错误的字符前移逻辑:过滤操作只保留符合要求的字符,不需要修改输入串内容,也不会出现数组越界访问的问题。
  • 所有非数字字符统一跳过处理,覆盖所有非数字场景,不会漏过不符合要求的字符。
  • 终止符补在输出串实际内容的末尾位置,保证输出是合法的C字符串,不会残留内存垃圾值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:03:29