减少char矩阵

Decreasing of char matrix

我有一个 char 矩阵,宽度假设为 7,其中包括数字和符号。完成数学运算后,我需要减小矩阵大小并重写它,我在现有矩阵上按函数执行所有这些操作:

template<typename T>
T** Squeeze(T**Digits, int&size, int k, int i)

唯一的问题是,当我尝试修复框架时,通过将 - [=13=] 放在最后一个矩阵的末尾,它没有这样做,而是重写了第一个一个元素。我不明白它有什么问题。

template<typename T>
T** Squeeze(T**Digits, int&size, int k, int i)
{
    int c=0, j=0;
    for(int f=0, c=0; f<size; f++)
    {
        if(f==i-2)
        {
            sprintf(Digits[c],"%d",k);
            c++;
        }
        else if(f<i-2||f>=i+1)
        {
            strcpy(Digits[c], Digits[f]);
            c++;
        }
    }
    c++;
    Digits[c][j]='[=11=]';
    size-=2;
    return Digits;
}

例如,当我路过时:

我希望 Digits 修改为包含:“10 1 - 4 * +”,并且 size 修改为包含 13。

这个架构从根本上被打破了:

  1. 它接收一个 C 字符串指针并试图将其视为一个二维数组。 C 字符串指针如何​​知道有关列的任何信息?
  2. 它正在尝试替换字符串中的两个数字,但并未删除运算符。
  3. 无法指定要删除的字符数,算法总是从 [i - 2i] 替换,这不适用于:"10 3 +"
  4. Digits如果允许电力运营商,可能没有足够的空间。
  5. 大小已通过,但 C 字符串以 null 结尾,这是冗余信息

所以输入需要工作。但是假设我通过了:

  • char* Digits 指向保证足够长以包含输出的 c 字符串的指针(这断言 4 的修复)
  • size_t& size Digits 的当前长度(这将修复 1
  • int kDigits[i - replacementSize]
  • 开始写入的数字
  • size_t i替换结束位置保证大于replacementSize
  • int replacementSize Digits 中要替换的字符数(这将修复 23 )

此时可以使用copy_backward and to_string来解决问题:

const auto replacementString = to_string(k);
const auto offset = static_cast<int>(replacementString.size()) - replacementSize;

copy_backward(Digits + i + 1, Digits + size, Digits + size + offset);
copy(replacementString.begin(), replacementString.end(), Digits + i - replacementSize);
size += offset;

[Live Example]

如果尽管上面 5 仍然坚持空终止,只需确保 size 在 [=14= 中包含 '[=27=]' 字符] 并且此算法将复制它。