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
相关产品推荐
相关产品推荐

