2017-01-15 16 views
-3

私は2つのゼロ終了文字列を結合しなければならないという質問をしています。最初の文字列には単語が含まれ、2番目の文字列は空で2倍のサイズです。私は、だから私はこのC++ゼロ終了文字列を2つ組み合わせる?

#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; 
    } 
} 

を試してみました

char *combine(char *a); 

次のプロトタイプを持つ関数を使用する必要がありますしかし、私は次のコード

#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 *スタイルゼロ終端文字列として受け取り、二回の入力の長さをchar*文字列を返すC++で関数を書く

にお答えしようとしています質問です。返される文字列の前半には、元の配列の内容のコピーが含まれている必要があります。文字列の後半には、元の文字列の内容が逆の順序で含まれている必要があります。

関数は次のプロトタイプを持っている必要があります。

char *copy_and_reverse(char* a); 

注意:あなたは任意のライブラリ関数を使うべきではありません(例えばstring.hから)。

+1

あなたの問題の説明は不明です。 2つのゼロ終端文字列はありません。あなたの最初のコードは 'strcpy'のような文字列をコピーしますが、結果を終了させず、未定義の動作をします。次に、あなたは 'combine'(それが何をするべきか不明)について話しており、最後の例は' copy_and_reverse'を含んでいます(そこには逆もありません)。あなたは質問をしていると言った。どのような運動のテキストですか? – melpomene

+2

'cout'以外は、これは本当にC++ではありません。これはCです。タグを変更する必要があります。 – Charles

+0

@ c650 C++です。うーん、どのような意味で:あなたは 'のstd :: STRING'を持っているとき、C++での'のchar * 'をいじりにはポイントがありません – melpomene

答えて

1

あなたcopy_and_reverseコードに2つの大きな問題があります。

  1. 入力文字列をコピーした後、結果を終了しません。つまり、str2は有効な文字列ではありません。 [FIX

    str2[count] = '\0'; // after the loop 
    
  2. copy_and_reverseは、ローカル変数(str2)へのポインタを返します。関数が返った後、すべてのローカル変数はなくなり、mainは無効なポインタを扱っています。これを修正するには、str2staticとして宣言するか、グローバル変数にするなどの静的メモリを使用するか、または動的メモリ(new[](またはmalloc())でストレージを割り当てます)を使用してください。両方のアプローチにはそれぞれ欠点があります。

マイナーなもの:

  • variable;は何もしません(for (a; ...)for (b; ...)を参照してください)。
  • str2は、最終結果には十分ではありません。 str1は5バイト('t', 'e', 's', 't', '\0')なので、現在はchar str2[8]で十分ですが、最終的には結果としてlength * 2 + 1バイトを割り当てます。
+0

@ありがとう –

-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から実際の文字列を取得する方法がわからないので、私はあなたのコメントが間違って読ん – Charles

+0

それは私のdownvoteではないです。 – HolyBlackCat

+0

これはコンパイルされません。 – melpomene

関連する問題