【问题标题】:Writing null-terminated char array into object class with char array使用 char 数组将空终止字符数组写入对象类
【发布时间】:2012-10-27 09:00:54
【问题描述】:

首先我想说我是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 数组,但我不明白为什么。

【问题讨论】:

    标签: arrays string heap-memory stack-memory


    【解决方案1】:

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

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

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

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

    t e s t \0

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

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

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

    t e s t \0 # # # #

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

    t e s t # # # #

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

    t e s t \54 \0 # # #

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

    【讨论】:

    • 这为我澄清了。感谢 cmets 伙计们!
    【解决方案2】:

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

    st_string[i] = '\0';
    

    【讨论】:

      【解决方案3】:

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

      while (i <= length) //write string with input
      {
          appropriate_string[i] = input[i];
          i++;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 2012-04-20
        • 2012-08-14
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        相关资源
        最近更新 更多