C++组合两个以零结尾的字符串

C++ Combining two zero terminated strings?

本文关键字:结尾 字符串 两个 组合 C++      更新时间:2023-10-16

所以我在做一个问题,我必须连接两个以零结尾的字符串,第一个包含一个单词,第二个为空,是原始数组的两倍大。我能够使用以下代码来完成这项工作

#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代码中存在两个大问题。

  1. 复制输入字符串后,不会终止结果。这意味着str2不是一个有效的字符串。修复:

    str2[count] = '';  // after the loop
    
  2. copy_and_reverse返回指向局部变量(str2)的指针。函数返回后,它的所有局部变量都消失了,main正在处理一个无效指针。要解决此问题,请使用静态内存(例如,通过将str2声明为static或使其成为全局变量)或动态内存(使用new[](或malloc())分配存储)。这两种方法都有各自的缺点。

次要内容:

  • variable;不执行任何操作(参见for (a; ...)for (b; ...))
  • str2对于最终结果来说不够大。str1是5字节长('t', 'e', 's', 't', ''),所以char str2[8]目前已经足够了,但最终您需要为结果分配length * 2 + 1字节

我相信这将满足您的需求:

#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 
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] = ''; // null out last one
return b;
}
static int strlen(char *c) {
char *s = c;
while( *s++ );
return s-c-1;
}