2017-01-15 43 views
-3

所以我在做一個問題,我必須加入兩個零終止的字符串,第一個包含一個單詞,第二個是空的,兩倍於原始數組的大小。我可以用下面的代碼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

回答

1

,我們在您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 –

-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 \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