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

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;
}

修正说明

  1. 独立处理数字组:遍历字符串时,先定位每个连续数字的起始和结束位置,确保每个数字组单独计算,避免进位跨组传递
  2. 进位隔离:每个数字组处理完成后重置进位,不会影响其他数字或非数字区域
  3. 动态调整字符串长度:当数字翻倍后产生新高位时,通过后移字符腾出位置插入新数字,保证字符串结构正确
  4. 自定义工具函数:用strLength替代标准库的strlen,符合约束要求

内容的提问来源于stack exchange,提问作者Irma Ibrović

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:35:37