2

首先我想说我是新手C++,这是一个家庭作业。另外,我不确定我在标题中使用了正确的定义,如果我错了,请纠正我。

我必须创建一个字符串类来存储以空字符结尾的字符数组的内容。如果输入的长度大于 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但在这两种情况下,存储的字符串在末尾都有更多(奇怪的未定义)字符。所以在“测试”的情况下,我得到 test#54 或其他东西。

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

4

3 回答 3

0

您的while (i != length)循环不会将 final 复制\0到新字符数组中。您应该将它们更改为

while (i <= length) //write string with input
{
    appropriate_string[i] = input[i];
    i++;
}
于 2012-11-07T10:16:00.897 回答
0

我发现您的代码存在一些问题。首先,究竟是什么意思:

// Check for zero length
if (length == 0)
{
    st_string[1] = ' ';
}

? 如果其余代码完全健壮,则自然会处理空字符串的情况。您在这里所做的只是使其在原始字符串中有空格时无法可靠地使用您的类。

至于为什么您会遇到您要询问的特定错误 - 想想当您逐个字符复制时您在做什么。您的原始字符串是这样的:

t e s t \0

并且length是 4。这意味着你的循环更远会将 4 个字符复制到本地数组中。你看到这里的问题了吗?

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

恰恰相反,事实上。看,我遗漏的部分是你在内存中的字符串之后的部分。原文是:

t e s t \0 # # # #

其中#'s 基本上是随机字节。正在复制字符串,使其变为:

t e s t # # # #

因为你没有复制\0。将字符串读回的循环将继续进行,直到它到达一个空字节 - 但你无法知道它会在哪里,因为你自己没有把它放在那里。如果它碰巧被丢弃在内存中,它看起来像这样:

t e s t \54 \0 # # #

那么你只会得到一个垃圾字符,但它可能会更多。所以实际上,在某种程度上,您保存字符串比您预期的要长,但不是正常意义上的。

于 2012-11-07T10:16:16.800 回答
0

在你的while循环之后,你一个一个地复制字符,就在这个while循环之后,你需要将字符串结尾字符添加到你的变量中

st_string[i] = '\0';
于 2012-11-07T10:16:38.010 回答