我正在免费存储上分配内存并将 char 放在该存储上,但是它在 char 的长输入中给出了一些意想不到的输出,并且在我的电脑上它给了我超过 1 个字符的输入的意想不到的结果,但是如果我在
delete [] p;
中注释掉add_char()
,它给出了预期的结果。
#include <iostream>
#include <cstring>
char* add_char(char* p, char ch)
{
char* pc = new char[strlen(p) + 1];
for (size_t i = 0; i <= strlen(p); ++i) {
if (i == strlen(p))
pc[i] = ch;
else
pc[i] = p[i];
}
delete[] p;
return pc;
}
int main()
{
char ch = 0;
char* pc = new char[1]{'a'};
while (std::cin >> ch && ch != '!') {
pc = add_char(pc, ch);
}
std::cout << "pc : " << pc << "\n";
std::cout << strlen(pc) << "\n";;
}
strlen
依赖于空字符 \0
来计算给定字符串的长度,因此您必须为两个初始值提供它:
char* pc = new char[]{'a', '\0'};
..并在将插入的字符一一附加时保留它:
const std::size_t newLength = strlen(p) + 1;
char* pc = new char[newLength];
for (size_t i = 0; i <= newLength; ++i) {
if (i == newLength)
pc[i] = '\0';
if (i == newLength - 1)
pc[i] = ch;
else
pc[i] = p[i];
}
P.S. 或者,您可以放弃使用
strlen
并在其他地方保留数组长度
你没有为你的
char[]
字符串分配足够的内存,并且你没有正确地用 '\0'
终止它们。
试试这个:
#include <iostream>
#include <cstring>
char* add_char(char* p, char ch)
{
size_t len = strlen(p);
char* pc = new char[len + 2]; // +1 for ch, +1 for terminator
for (size_t i = 0; i < len; ++i) {
pc[i] = p[i];
}
// alternatively:
// strcpy(pc, p);
pc[len+0] = ch;
pc[len+1] = '\0';
delete[] p;
return pc;
}
int main()
{
char* pc = new char[2]{'a', '\0'};
char ch;
while (std::cin >> ch && ch != '!') {
pc = add_char(pc, ch);
}
std::cout << "pc : " << pc << '\n';
std::cout << strlen(pc) << '\n';
delete[] pc;
return 0;
}