gpt4 book ai didi

c++ - 回顾C++:从Int转换为Char

转载 作者:行者123 更新时间:2023-11-30 01:31:07 27 4
gpt4 key购买 nike

自从我使用C++已经有一段时间了,我目前正在赶上即将进行的编程测试。我具有具有此签名的以下功能:

void MyIntToChar(int *arrayOfInt,char* output)

Int是整数数组,而char *输出是缓冲区,缓冲区的长度应足以容纳函数接收的整数的字符串表示形式。

这是使用此功能的示例:
int numbers[3] = {11, 26, 81};
char* output = ""; // this I'm sure is not valid, any suggestions on how to
// to properly initialize this string?
MyIntToChar(numbers,output);
cout << output << endl; // this should print "11 26 81" or "11, 26, 81".
// i.e. formatting should not be a problem.

我一直在审查大学时期的旧c++笔记,但是我一直在遇到这些问题。我现在很讨厌自己进入Java世界,而不是在其中工作。

谢谢。

最佳答案

void MyIntToChar(int *arrayOfInt, char* output);


这在很多方面都是错误的。首先,这是一个误称。通常,您不能将整数转换为一个字符,因为所有整数( 0 ... 9)中只有十个适合。因此,我假设您想将整数转换为 _strings

然后,如果将数组传递给函数,则它们会衰减到指向第一个元素 的指针,并且有关数组大小的所有信息都会丢失。 因此,当您将数组传递给函数时,还需要传递大小信息。
可以使用C的方式进行操作,并将元素数量作为 std::size_t(作为 sizeof(myarray)/sizeof(myarray[0])获得):
void MyIntToStr(int *arrayOfInt, std::size_t arraySize, char* output);

或者以C++方式进行操作,并传入两个 迭代器,一个指向第一个元素(所谓的begin迭代器),另一个指向最后一个元素(结束迭代器):
void MyIntToStr(int *begin, int *end, char* output);

您可以通过不坚持要求迭代器为 int*来改进此问题,但是只要取消引用,它就可以生成 int:
template< typename FwdIt >
void MyIntToStr(FwdIt begin, FwdIt end, char* output);

(模板将要求您在 header 中实现该算法。)

然后是输出的问题。首先,您真的希望所有数字都写入一个字符串中吗?如果是这样,应该如何将它们分开?没有?空格?逗号?
还是您希望返回一个字符串数组?

假设您真的想要一个字符串,如果我将 {1, 2, 3, 4, 5}数组传递给您的函数,则它需要五个单位整数的空间以及四个分隔符的空间。您的函数签名建议您先分配给我,但是坦率地说,如果必须自己计算,我自己也可以进行转换。此外,我无法告诉您 char*指向多少内存,因此您无法检查我是否正确。正如几代开发人员所发现的那样,每次都很难做到这一点,以至于发明了几种计算机语言来简化程序员的工作。其中之一就是C++,如今它带有动态调整大小的字符串类。
(如果对我和您而言),如果我可以向您传递搅动,而您在其中写道:
template< typename FwdIt >
void MyIntToChar(FwdIt begin, FwdIt end, std::string& output);

请注意,我通过每个非 const引用传递字符串。这使您可以修改我的字符串,让我看看您所做的更改。
但是,一旦执行完此操作,您最好返回一个新字符串,而不是要求我将一个字符串传递给您:
template< typename FwdIt >
std::string MyIntToChar(FwdIt begin, FwdIt end);

但是,如果您实际上想要返回一个字符串数组,则不应将一个字符串写入其中,而应将其写入其中。天真的方法是传递动态可调整大小的字符串的动态可调整大小的数组。在C++中,这拼写为 std::vector<std::string>:
template< typename FwdIt >
void MyIntToStr(FwdIt begin, FwdIt end, std::vector<std::string>& output);

同样,最好返回一个这样的数组(尽管有些人会不同意,因为复制字符串数组可能会被认为很昂贵)。但是,执行此操作的最佳方法将不需要我以“std::vector”的形式接受结果。如果我需要(链接的)列表中的字符串怎么办?还是写到某个流?
最好的方法是让函数接受将结果写入其中的输出迭代器:
template< typename FwdIt, typename OutIt >
void MyIntToStr(FwdIt begin, FwdIt end, OutIt output);

当然,由于现在太笼统了,很难看到它的作用,所以很好,我们给它起了好名字。但是,看一下它,我立即认为这应该建立在另一个函数上,而这个函数可能甚至不止这个函数:一个函数,它接受一个整数并将其转换为一个字符串。假设我们有这样的功能:
std::string MyIntToStr(int i);

实现数组版本非常容易:
template< typename FwdIt, typename OutIt >
void MyIntToStr(FwdIt begin, FwdIt end, OutIt output)
{
while(begin != end)
*output++ = MyIntToStr(*begin++);
}

现在剩下要做的就是实现该 std::string MyIntToStr(int i);函数。正如其他人已经写过的那样,使用字符串流很容易做到这一点,并且为此找到一些很好的示例也应该没有问题。但是,找到不好的例子甚至更容易,所以我想在这里给你一个例子:
std::string MyIntToStr(int i);
{
std::ostringstream oss;
oss << i:
if(!oss) throw "bah!"; // put your error reporting mechanism here
return oss.str();
}

当然,在给定模板的情况下,可以很容易地概括为接受任何可流式传输的内容:
template< typename T >
std::string MyIntToStr(const T& obj);
{
std::ostringstream oss;
oss << obj:
if(!oss) throw "bah!"; // put your error reporting mechanism here
return oss.str();
}

请注意,在使用此通用功能模板的情况下,处理数组的 MyIntToStr()现在可自动处理该功能模板处理的任何类型的数组。

因此,在这段旅程(我很抱歉,我很抱歉)的结尾,这就是我们要做的:将所有内容(可以写到流中)转换为字符串的通用函数模板,以及将转换为字符串的通用函数模板将任何对象数组(可以写入流)的内容转换为流。

请注意,如果您至少有十几次关于C++的90分钟的讲座,并且您的讲师未能教给您至少 了解我在这里写的内容,那么您的 并不是,根据现代C++教学标准讲得很好。

关于c++ - 回顾C++:从Int转换为Char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3594200/

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