C++组合两个零终止的字符串?
所以我在做一个问题,我必须加入两个零终止的字符串,第一个包含一个单词,第二个是空的,两倍于原始数组的大小。我可以用下面的代码C++组合两个零终止的字符串?
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
char str1[] = "test";
char str2[(sizeof(str1)-1)*2];
char *p;
int count = 0;
for(p = str1; *p != 0; p++) {
str2[count] = *p;
count++;
}
cout << str2;
}
得到这个工作但是我必须用一个函数的原型如下
char *combine(char *a);
所以,我想这个
#include <stdio.h>
#include <iostream>
using namespace std;
char *copy_and_reverse(char *a) {
char str2[8];
int count = 0;
char* b = str2;
for(a; *a != 0; a++) {
str2[count] = *a;
count++;
}
return b;
}
int main()
{
char str1[] = "test";
char *a;
a = str1;
char* b = copy_and_reverse(a);
for(b; *b != 0; b++) {
cout << *b;
}
}
但它确实不工作(它正在打印字符串,但它后面打印了一些随机字符),我对指针感到困惑,任何人都可以帮我解决这个问题吗?
编辑:这里是我想回答
C++编写一个函数,它作为
char *
风格零结尾的字符串,并返回一个字符串char*
两次输入的长度的问题。返回的字符串的前半部分应包含原始数组内容的副本。字符串的后半部分应该以相反的顺序包含原始字符串的内容。该函数应具有以下原型:
char *copy_and_reverse(char* a);
注意:你不应该使用任何库函数(例如从
string.h
)。
,我们在您copy_and_reverse
代码的两大问题。
-
复制输入字符串后,您不会终止结果。这意味着
str2
不是有效的字符串。修正:str2[count] = '\0'; // after the loop
copy_and_reverse
返回一个指向局部变量(str2
)。函数返回后,其所有局部变量均消失,并且main
正在处理无效指针。要解决此问题,请使用静态内存(例如,通过声明str2
为static
或使其成为全局变量)或动态内存(使用new[]
(或)分配存储)。这两种方法都有其缺点。
小东西:
-
variable;
什么也不做(见for (a; ...)
,for (b; ...)
)。 -
str2
对于最终结果不够大。str1
的长度为5个字节('t', 'e', 's', 't', '\0'
),所以char str2[8]
对于现在来说已经足够了,但是最终您希望为您的结果分配length * 2 + 1
个字节。
谢谢@melpomene –
我相信,这将满足您的需求:
#include <stdio.h>
#include <stdlib.h>
static char* copy_and_reverse(char* a);
static int strlen(char *c); // self-implemented
int main(void) {
char *a = "some string";
char *b = copy_and_reverse(a);
printf("%s", b);
free(b);
return 0;
}
static char* copy_and_reverse(char* a) {
int n = strlen(a);
char *b = new char[n * 2 + 1]; // get twice the length of a and one more for \0
for (int i = 0; i < n; ++i) { // does copying and reversing
b[i] = a[i];
b[i+n] = a[n-i-1];
}
b[2 * n] = '\0'; // null out last one
return b;
}
static int strlen(char *c) {
char *s = c;
while(*s++);
return s-c-1;
}
@HolyBlackCat是的,你不能按照OP使用'string.h'的impl。如果这就是为什么你downvoted,反对请 – Charles
这不是我downvote。 – HolyBlackCat
这甚至没有编译。 – melpomene
您的问题描述不清楚。你有没有两个零终止的字符串。你的第一个代码拷贝一个字符串(像'strcpy'),但不会终止结果,产生未定义的行为。然后你说的是'combine'(不清楚应该做什么),最后一个例子包含'copy_and_reverse'(在那里没有反转)。你说你在做一个问题。练习的实际文字是什么? – melpomene
除了'cout',这真的不是C++。这是C.你应该改变标签。 – Charles
@ c650它是C++。 – melpomene