gpt4 book ai didi

C++ String.Format 实现错误

转载 作者:行者123 更新时间:2023-11-30 04:08:34 25 4
gpt4 key购买 nike

我正在尝试在 C++ 中实现与 C#String.Format 相同的功能。但是,在某些情况下我的输出有问题:

#include <iostream>
#include <string>

class format_base
{
public:
format_base(const char *base) : argp_(0)
{
base_ = (char*)calloc(4097, sizeof(char));
sz_ = 4097;
memcpy(base_, base, strlen(base));
};
~format_base()
{
free(base_);
}
format_base &arg(const char *argument)
{
if ((strlen(base_) - 3) + strlen(argument) > sz_)
{
base_ = (char*)realloc(base_, (sz_ *= 2));
}
std::string elim = "{";
elim.append(std::to_string(argp_++));
elim.append("}");
std::string tbase = base_;
size_t f = tbase.find(elim.c_str());
if (f != std::string::npos)
{
tbase.replace(f, elim.size(), argument);
}
memcpy(base_, tbase.c_str(), tbase.length());
return *this;
}
char *value()
{
return base_;
}
char *operator()()
{
return base_;
}
private:
char *base_;
size_t argp_, sz_;
};

format_base &format(const char *base)
{
return *new format_base(base);
}

int main()
{
std::cout << format("Hello {0}").arg("a")(); // Prints "Hello a0} "
std::cout << format(" Hello {0}").arg("ab")(); // Prints " Hello ab} "
std::cout << format(" Hello {0}\n").arg("abc")(); // Prints " Hello abc\n"
std::cout << format("Hello {0}\n").arg("a")(); // Prints "Hello a\n}"
std::cout << format("Hello {0}\n").arg("ab")(); // Prints "Hello ab\n"
std::cout << format("Hello {0}\n").arg("abc")(); // Prints "Hello abc\n"
getchar();
}

总产量:

Hello a0} Hello ab} Hello abc

Hello a

}

Hello ab

_

Hello abc

_

我很困惑,如果你能提供帮助,我将不胜感激

最佳答案

我猜你忘了正确设置字符串长度。 “坏”输出只是结果字符串和旧字符串的最后一个字符。如果字符串因更换而缩短,则需要将其剪断。

memcpy(base_, tbase.c_str(), tbase.length());

length() 不计算终止 \0,所以您可能想要

strcpy(base_, tbase.c_str());

memcpy(base_, tbase.c_str(), tbase.length()+1);

关于C++ String.Format 实现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21735303/

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