减少焦炭基质

时间:2015-10-14 10:31:04

标签: c++ string matrix c-strings postfix-notation

我有一个char宽度矩阵,比方说7,包括数字和符号。在进行数学运算后,我需要减小矩阵大小并重写它,我通过函数在现有矩阵上完成所有这些:

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

唯一的问题是,当我尝试修复框架时,矩阵的结尾是什么时候将 - \0放到最后一个,它不会这样做,而是重写第一个一个要素。我无法理解它的错误。

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]='\0';
    size-=2;
    return Digits;
}

例如,当我传入时:

  • &#34; 10 3 2 - 4 * +&#34; Digits
  • 15 for size
  • 1表示k
  • 6表示i

我希望修改Digits以包含:&#34; 10 1 - 4 * +&#34;并且size被修改为包含13。

1 个答案:

答案 0 :(得分:1)

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

  1. 它接收一个C-String指针并尝试将其视为二维数组。 C-String指针如何知道关于列的任何内容?
  2. 它正在尝试替换字符串中的两个数字,但它并没有删除运算符。
  3. 无法指定要删除的字符数,该算法始终取代[i - 2i],但这不适用于:"10 3 +" < / LI> 如果允许电力运营商,
  4. Digits可能没有足够的空间。
  5. 传递大小,但C-String以空值终止,这是冗余信息
  6. 所以输入需要工作。但我们可以说我已经通过了:

    • char* Digits一个指向c-string的指针,保证足够长以包含输出(这声明修复 4
    • size_t& size Digits的当前长度(这将修复 1
    • int kDigits[i - replacementSize]
    • 开始编写的号码
    • size_t i替换的结束位置,保证大于replacementSize
    • int replacementSize Digits中要替换的字符数(这将修复 2 3

    在这种情况下,copy_backwardto_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 的情况下坚持使用null终止,请确保size包含'\0'中的Digits字符,此算法将复制它。