我有一个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;
}
例如,当我传入时:
Digits
size
k
i
我希望修改Digits
以包含:&#34; 10 1 - 4 * +&#34;并且size
被修改为包含13。
答案 0 :(得分:1)
这种架构从根本上被打破了:
i - 2
,i
],但这不适用于:"10 3 +"
< / LI>
如果允许电力运营商,Digits
可能没有足够的空间。所以输入需要工作。但我们可以说我已经通过了:
char* Digits
一个指向c-string的指针,保证足够长以包含输出(这声明修复 4 )size_t& size
Digits
的当前长度(这将修复 1 )int k
从Digits[i - replacementSize]
size_t i
替换的结束位置,保证大于replacementSize
int replacementSize
Digits
中要替换的字符数(这将修复 2 和 3 )在这种情况下,copy_backward
和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;
如果在上面 5 的情况下坚持使用null终止,请确保size
包含'\0'
中的Digits
字符,此算法将复制它。