gpt4 book ai didi

c++ - 打印自定义字符串数据时出现奇怪的输出(c++ 新手)

转载 作者:行者123 更新时间:2023-11-28 03:42:02 30 4
gpt4 key购买 nike

我主要担心的是我是否安全、高效地执行此操作,并且在大多数情况下正确执行。

我需要一些帮助来编写我的字符串类实现。也许有人可以帮助我解决我想知道的问题?

我正在尝试编写自己的字符串类以扩展功能和学习目的。我不会用它来代替 std::string 因为那可能有潜在的危险。 :-P

当我使用 std::cout 打印出我的字符串的内容时,我得到了一些意外的输出,我想我知道为什么,但我不太确定。我将它缩小到我的分配函数,因为我在字符串中存储字符的任何其他方式都很好。这是我的分配功能:

void String::assign(const String &s)
{
unsigned bytes = s.length() + 1;

// if there is enough unused space for this assignment
if (res_ >= bytes)
{
strncpy(data_, s.c_str(), s.length()); // use that space
res_ -= bytes;
}
else
{
// allocate enough space for this assignment
data_ = new char[bytes];
strcpy(data_, s.c_str()); // copy over
}

len_ = s.length(); // optimize the length
}

我有一个构造函数,它为 char ptr 保留固定数量的字节以分配和保存。它是这样声明的:

explicit String(unsigned /*rbytes*/);

res_变量只是记录传入的字节数并存储起来。这是 string.cpp 中的构造函数代码:

String::String(unsigned rbytes)
{
data_ = new char[rbytes];
len_ = 0;
res_ = rbytes;
}

我认为使用此方法比为字符串分配新空间更有效。所以当我声明一个新字符串时,我可以只使用我最初保留的任何空间。这是我测试它是否有效的方法:

#include <iostream>

#include "./string.hpp"

int main(int argc, char **argv)
{
winks::String s2(winks::String::to_string("hello"));
winks::String s(10);

std::cout << s2.c_str() << "\n" << std::endl;

std::cout << s.unused() << std::endl;
std::cout << s.c_str() << std::endl;
std::cout << s.length() << std::endl;

s.assign(winks::String::to_string("hello")); // Assign s to "hello".

std::cout << s.unused() << std::endl;
std::cout << s.c_str() << std::endl;
std::cout << s.length() << std::endl;

std::cout.flush();
std::cin.ignore();

return 0;
}

如果您担心 winks::String::to_string,我只是将 char ptr 转换为我的字符串对象,如下所示:

String String::to_string(const char *c_s)
{
String temp = c_s;
return temp;
}

但是,我在此方法中使用的构造函数是私有(private)的,因此我将 to_string 强加给自己。到目前为止,我对此没有任何问题。我这样做的原因是为了避免为不同的参数重写方法,即:char * 和 String

私有(private)构造函数的代码:

String::String(const char *c_s)
{
unsigned t_len = strlen(c_s);
data_ = new char[t_len + 1];
len_ = t_len;
res_ = 0;
strcpy(data_, c_s);
}

非常感谢所有帮助。如果我没有提供有效数量的信息,请告诉我您想知道的内容,我很乐意编辑我的帖子。

编辑:我没有发布完整的 string.hpp 和 string.cpp 的原因是因为它相当大,我不确定你们是否会喜欢。

最佳答案

您必须决定是否始终存储内部以 0 结尾的字符串。如果您不存储以零字节结尾的字符串,您的 c_str 函数必须添加一个.否则,它不会返回 C 字符串。

您的 assign 函数不会 0 终止。所以要么它坏了,要么你不打算 0 终止。如果是前者,修复它。如果是后者,请检查您的 c_str 函数以确保它在末尾放置一个 0。

关于c++ - 打印自定义字符串数据时出现奇怪的输出(c++ 新手),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8890026/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com