减少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;
}
例如,当我路过时:
- “10 3 2 - 4 * +”为
Digits
- 15 代表
size
- 1 代表
k
- 6 代表
i
我希望 Digits
修改为包含:“10 1 - 4 * +”,并且 size
修改为包含 13。
这个架构从根本上被打破了:
- 它接收一个 C 字符串指针并试图将其视为一个二维数组。 C 字符串指针如何知道有关列的任何信息?
- 它正在尝试替换字符串中的两个数字,但并未删除运算符。
- 无法指定要删除的字符数,算法总是从 [
i - 2
、i
] 替换,这不适用于:"10 3 +"
Digits
如果允许电力运营商,可能没有足够的空间。
- 大小已通过,但 C 字符串以 null 结尾,这是冗余信息
所以输入需要工作。但是假设我通过了:
char* Digits
指向保证足够长以包含输出的 c 字符串的指针(这断言 4 的修复)
size_t& size
Digits
的当前长度(这将修复 1)
int k
从 Digits[i - replacementSize]
开始写入的数字
size_t i
替换结束位置保证大于replacementSize
int replacementSize
Digits
中要替换的字符数(这将修复 2 和 3 )
此时可以使用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;
如果尽管上面 5 仍然坚持空终止,只需确保 size
在 [=14= 中包含 '[=27=]'
字符] 并且此算法将复制它。
我有一个 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;
}
例如,当我路过时:
- “10 3 2 - 4 * +”为
Digits
- 15 代表
size
- 1 代表
k
- 6 代表
i
我希望 Digits
修改为包含:“10 1 - 4 * +”,并且 size
修改为包含 13。
这个架构从根本上被打破了:
- 它接收一个 C 字符串指针并试图将其视为一个二维数组。 C 字符串指针如何知道有关列的任何信息?
- 它正在尝试替换字符串中的两个数字,但并未删除运算符。
- 无法指定要删除的字符数,算法总是从 [
i - 2
、i
] 替换,这不适用于:"10 3 +"
Digits
如果允许电力运营商,可能没有足够的空间。- 大小已通过,但 C 字符串以 null 结尾,这是冗余信息
所以输入需要工作。但是假设我通过了:
char* Digits
指向保证足够长以包含输出的 c 字符串的指针(这断言 4 的修复)size_t& size
Digits
的当前长度(这将修复 1)int k
从Digits[i - replacementSize]
开始写入的数字
size_t i
替换结束位置保证大于replacementSize
int replacementSize
Digits
中要替换的字符数(这将修复 2 和 3 )
此时可以使用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;
如果尽管上面 5 仍然坚持空终止,只需确保 size
在 [=14= 中包含 '[=27=]'
字符] 并且此算法将复制它。