C语言实现字符串数字翻倍函数遇问题,求解决方案
问题:实现C语言
doubleString函数,处理混合文本中的数字翻倍 需求说明
- 编写
doubleString函数,接收字符串,将其中所有连续数字组成的数乘2,返回字符串首指针以支持链式调用 - 示例:输入
"This sentence contains number 4, number 8 and number 88",输出"This sentence contains number 8, number 16 and number 176" - 约束:禁止使用
string.h、stdlib.h库函数,禁止stdio.h中的sprintf/sscanf,禁止创建辅助字符串
现有代码问题
现有代码仅对纯数字字符串有效,混合文本下会出现计算错误:
- 测试输入:
'U ovoj recenici se nalazi broj 4, broj 8 i broj 88' - 预期输出:
'U ovoj recenici se nalazi broj 8, broj 16 i broj 176' - 实际输出:
'U ovoj recenici se nalazi broj 9, broj 7 i broj 76' - 例外情况:输入
"1 i 1 jesu 2"时输出符合预期
现有代码如下:
#include <stdio.h> void inputString(char array[], int size) { char character = getchar(); if (character == '\n') character = getchar(); int i = 0; while (i < size - 1 && character != '\n') { array[i] = character; i++; character = getchar(); } array[i] = '\0'; } char *doubleString(char *text) { int carry = 0; int length = 0; while (text[length] != '\0') { length++; } for (int i = length - 1; i >= 0; i--) { if (text[i] >= '0' && text[i] <= '9') { int digit = ((int)text[i]) * 2 + carry; carry = digit / 10; text[i] = (digit % 10) + '0'; } } while (carry > 0) { for (int i = length; i > 0; i--) { text[i] = text[i - 1]; } text[0] = (carry % 10) + '0'; carry /= 10; length++; } return text; } int main() { char text[1000]; int size = sizeof(text); printf("Enter text: "); inputString(text, size); char *result = doubleString(text); printf("'%s'", result); return 0; }
问题根源
现有代码的核心错误是:
- 从字符串末尾向前遍历所有数字时,未区分独立的连续数字组,把非连续的数字当成同一个数处理,导致进位错误传递到相邻的非数字区域或其他数字组
- 比如处理
4,时,进位会被错误保留,影响后续数字的计算,最终出现数字错乱
修正方案
需要遍历字符串,定位每个连续数字组,从每个组的末尾向前处理翻倍和进位,处理完一个组后重置进位;同时处理数字组长度增加的情况(如8变16),将数字组后的字符向后移动,腾出位置插入新的高位数字。
修正后的代码:
#include <stdio.h> void inputString(char array[], int size) { char character = getchar(); if (character == '\n') character = getchar(); int i = 0; while (i < size - 1 && character != '\n') { array[i] = character; i++; character = getchar(); } array[i] = '\0'; } // 自定义字符串长度计算函数,替代string.h的strlen int strLength(char *text) { int len = 0; while (text[len] != '\0') len++; return len; } char *doubleString(char *text) { int len = strLength(text); int i = 0; while (i < len) { // 定位连续数字组的起始位置 if (text[i] >= '0' && text[i] <= '9') { int start = i; // 找到数字组的结束位置(下一个非数字字符的前一位) while (i < len && text[i] >= '0' && text[i] <= '9') { i++; } int end = i - 1; int carry = 0; // 从数字组末尾向前处理每个数字的翻倍和进位 for (int j = end; j >= start; j--) { int digit = (text[j] - '0') * 2 + carry; carry = digit / 10; text[j] = (digit % 10) + '0'; } // 处理剩余进位,在数字组前插入新的高位数字 while (carry > 0) { // 将数字组及之后的所有字符向后移动一位 for (int k = len; k > start; k--) { text[k] = text[k - 1]; } text[start] = (carry % 10) + '0'; carry /= 10; len++; // 更新字符串总长度 start++; // 数字组起始位置后移(因为插入了新数字) end++; // 数字组结束位置同步后移 } } else { i++; } } return text; } int main() { char text[1000]; int size = sizeof(text); printf("Enter text: "); inputString(text, size); char *result = doubleString(text); printf("'%s'", result); return 0; }
修正说明
- 独立处理数字组:遍历字符串时,先定位每个连续数字的起始和结束位置,确保每个数字组单独计算,避免进位跨组传递
- 进位隔离:每个数字组处理完成后重置进位,不会影响其他数字或非数字区域
- 动态调整字符串长度:当数字翻倍后产生新高位时,通过后移字符腾出位置插入新数字,保证字符串结构正确
- 自定义工具函数:用
strLength替代标准库的strlen,符合约束要求
内容的提问来源于stack exchange,提问作者Irma Ibrović
相关产品推荐
相关产品推荐

