首先,我想说我是C++
的新手,这是一项家庭作业。另外,我不确定我在标题中使用了正确的定义,如果我错了,请纠正我。
我必须创建一个字符串类,它存储以null结尾的char数组的内容。如果输入的长度大于32,则将其存储在堆上,否则将其存储在堆栈中。
现在我正忙于构造函数:
#include "SString.h"
#include <iostream>
using namespace std;
SString::SString(const char* input)
{
// Determine length of input
int length = 0;
while (input[length] != '\0')
{
length++;
}
// Check for zero length
if (length == 0)
{
st_string[1] = ' ';
}
// Based on length, make heap string or use stack string
if(length > 32)
{
int i = 0;
p_string = new char[length];
while (i != length) //write string with input
{
p_string[i] = input[i];
i++;
}
}
else
{
int i = 0;
while(i != length) //write string with input
{
st_string[i] = input[i];
i++;
}
}
cout << "saved string:" << endl;
cout << p_string << endl;
}
现在我通过在main中调用带有这样字符串的SimpleString来测试它:
SString("test"); // or something
它有效,将字符串放在st_string
或p_string
上,但在这两种情况下,存储的字符串末尾都有更多(奇怪的未定义)字符。因此,在“测试”的情况下,我得到测试#54或其他东西。
我猜它会使保存的char数组大于输入的char数组,但我不明白为什么。
答案 0 :(得分:0)
您的while (i != length)
循环不会复制新字符数组中的最终\0
。你应该把它们改成
while (i <= length) //write string with input
{
appropriate_string[i] = input[i];
i++;
}
答案 1 :(得分:0)
我发现您的代码存在一些问题。首先,究竟是什么意思:
// Check for zero length
if (length == 0)
{
st_string[1] = ' ';
}
?如果代码的其余部分都很健壮,那么空字符串的情况将自然处理。你在这里所做的就是制作它,这样如果原始字符串中有空格,你的类就无法可靠地使用。
至于为什么你会得到你所询问的特定错误 - 想想你在逐个字符复制时所做的事情。您的原始字符串是:
t e s t \0
和length
是4.这意味着你的循环越往下将4个字符复制到本地数组中。你在这看到问题吗?
我猜它会使保存的char数组大于输入的char数组,但我不明白为什么。
事实上恰恰相反。请注意,我遗漏的部分是在内存中的字符串之后的内容。原文是:
t e s t \0 # # # #
其中#
基本上是随机字节。正在复制字符串,使其变为:
t e s t # # # #
因为你没有复制\ 0。读取字符串的循环将继续运行,直到它达到空字节为止 - 但是你无法知道它会在哪里,因为你没有自己放一个。如果它恰好被丢弃在内存中,看起来像这样:
t e s t \54 \0 # # #
然后你只会得到一个垃圾角色,但它可能会更多。实际上,在某种程度上,你 获得比你预期的更长的字符串,但不是正常意义上的。
答案 2 :(得分:0)
在你的while循环之后,你逐个复制字符,就在这个while循环之后,你需要将字符串结尾添加到你的变量中
st_string[i] = '\0';