我正在阅读Bjarne Stroustrup的第3版 The C ++ Programming Language 并试图完成所有练习。我不确定如何从第6.6节开始练习13,所以我想我会转向Stack Overflow以获得一些洞察力。以下是问题的描述:
编写一个函数 cat(),它带有两个C风格的字符串参数和 返回一个字符串,它是参数的串联。 使用 new 查找结果商店。
到目前为止,这是我的代码,带有问号,我不知道该怎么做:
? cat(char first[], char second[])
{
char current = '';
int i = 0;
while (current != '\0')
{
current = first[i];
// somehow append current to whatever will eventually be returned
i++;
}
current = '';
i = 0;
while (current != '\0')
{
current = second[i];
// somehow append current to whatever will eventually be returned
i++;
}
return ?
}
int main(int argc, char* argv[])
{
char first[] = "Hello, ";
char second[] = "World!";
? = cat(first, second);
return 0;
}
以下是我的问题:
std::string* result = new std::string;
之类的事情,还是应该使用 new 以某种方式创建另一个C风格的字符串?答案 0 :(得分:4)
在“真实”程序中,是的,你会使用std :: string。听起来这个例子让你想要使用C字符串。
所以也许是这样的:
char * cat(char first[], char second[])
{
char *result = new char[strlen(first) + strlen(second) + 1];
...
问:你如何“追加”?答:只需将“第一”中的所有内容写入“结果”。
一旦你完成,然后继续将所有内容写入“秒”结果(从你离开的地方开始)。完成后,请务必在末尾追加'\ 0'。
答案 1 :(得分:4)
如何使用 new 查找商店?我是否应该做
std::string* result = new std::string;
之类的事情,或者我应该使用 new 以某种方式创建另一个C风格的字符串?
后者;该方法采用C风格的字符串,文本中没有任何内容表明它应该返回任何其他内容。因此,函数的原型应为char* cat(char const*, char const*)
。当然这是不你通常如何编写函数;手动内存管理在现代C ++中完全是禁忌,因为它容易出错。
虽然问题没有提到使用delete来释放内存,但我知道我应该因为我将使用new来分配。我应该在主要结束时删除,在返回之前删除吗?
在本练习中,是的。在现实世界中,没有:就像我上面所说,这完全是禁忌。实际上,您将使用std::string
返回new
和而不是分配内存。 如果你发现自己手动分配内存(假设这是有充分理由的话),你就不会将内存放在原始指针中,而是放在智能指针上 - std::unique_ptr
或std::shared_ptr
答案 2 :(得分:3)
std::string
(或者至少,这不是“在问题的精神中”)。是的,您应该使用new
来制作C风格的字符串。 答案 3 :(得分:3)
这是我从我的一个项目中挖出来的一些旧代码:
char* mergeChar(char* text1, char* text2){
//Find the length of the first text
int alen = 0;
while(text1[alen] != '\0')
alen++;
//Find the length of the second text
int blen = 0;
while(text2[blen] != '\0')
blen++;
//Copy the first text
char* newchar = new char[alen + blen + 1];
for(int a = 0; a < alen; a++){
newchar[a] = text1[a];
}
//Copy the second text
for(int b = 0; b < blen; b++)
newchar[alen + b] = text2[b];
//Null terminate!
newchar[alen + blen] = '\0';
return newchar;
}
通常,在“真实”程序中,您应该使用std::string
。请稍后再确认delete[] newchar
!
答案 4 :(得分:2)
练习的意思是使用new
来分配内存。 “查找商店”很奇怪,但事实上它就是它的作用。你告诉它你需要多少存储空间,它会找到你可以使用的可用内存块,并返回它的地址。
看起来练习不希望你使用std :: string。听起来你需要返回char*
。所以函数原型应该是:
char * cat(const char first [],const char second []);
请注意const
说明符。重要的是,您将能够将字符串文字作为参数传递。
因此,如果不立即提供代码,您需要做的是确定生成的char*
字符串应该有多大,使用new
分配所需的数量,将两个源字符串复制到新分配的空间,并将其返回。
请注意,您通常不会在C ++中手动执行此类内存管理(而是使用std::string
),但了解它仍然很重要,这就是为什么这个练习的原因。
答案 5 :(得分:0)
您似乎需要使用new
为字符串分配内存,然后返回指针。因此,return
类型的cat
将为`char*
。
你可以这样做:
int n = 0;
int k = 0;
//also can use strlen
while( first[n] != '\0' )
n ++ ;
while( second[k] != '\0' )
k ++ ;
//now, the allocation
char* joint = new char[n+k+1]; //+1 for a '\0'
//and for example memcpy for joining
memcpy(joint, first, n );
memcpy(joint+n, second, k+1); //also copying the null
return joint;
答案 6 :(得分:0)
它告诉你用C方式做这件事:
#include <cstring>
char *cat (const char *s1, const char *s2)
{
// Learn to explore your library a bit, and
// you'll see that there is no need for a loop
// to determine the lengths. Anything C string
// related is in <cstring>.
//
size_t len_s1 = std::strlen(s1);
size_t len_s2 = std::strlen(s2);
char *dst;
// You have the lengths.
// Now use `new` to allocate storage for dst.
/*
* There's a faster way to copy C strings
* than looping, especially when you
* know the lengths...
*
* Use a reference to determine what functions
* in <cstring> COPY values.
* Add code before the return statement to
* do this, and you will have your answer.
*
* Note: remember that C strings are zero
* terminated!
*/
return dst;
}
当您释放分配的内存时,不要忘记使用正确的运算符。否则你会有内存泄漏。
快乐的编码! : - )