使用char数组将以null结尾的char数组写入对象类

时间:2012-11-07 10:08:47

标签: arrays string stack heap

首先,我想说我是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_stringp_string上,但在这两种情况下,存储的字符串末尾都有更多(奇怪的未定义)字符。因此,在“测试”的情况下,我得到测试#54或其他东西。

我猜它会使保存的char数组大于输入的char数组,但我不明白为什么。

3 个答案:

答案 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';