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)。

+1

您的问题描述不清楚。你有没有两个零终止的字符串。你的第一个代码拷贝一个字符串(像'strcpy'),但不会终止结果,产生未定义的行为。然后你说的是'combine'(不清楚应该做什么),最后一个例子包含'copy_and_reverse'(在那里没有反转)。你说你在做一个问题。练习的实际文字是什么? – melpomene

+2

除了'cout',这真的不是C++。这是C.你应该改变标签。 – Charles

+0

@ c650它是C++。 – melpomene

,我们在您copy_and_reverse代码的两大问题。

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

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

小东西:

  • variable;什么也不做(见for (a; ...)for (b; ...))。
  • str2对于最终结果不够大。 str1的长度为5个字节('t', 'e', 's', 't', '\0'),所以char str2[8]对于现在来说已经足够了,但是最终您希望为您的结果分配length * 2 + 1个字节。
+0

谢谢@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; 
} 
+0

@HolyBlackCat是的,你不能按照OP使用'string.h'的impl。如果这就是为什么你downvoted,反对请 – Charles

+0

这不是我downvote。 – HolyBlackCat

+0

这甚至没有编译。 – melpomene