2016-07-10 19 views
2

2つの文字列を結合しようとしていますが、strが2番目のwhileループの最後の行にある読み取り専用の値です。関数のヘッダを変更せずに誰でも私がこれを行うことができますか?構造体からのcharポインタを反復する

また、Stringはstrという* charを持つ構造体です。

String * String_Combine(String * tar, const String * src) { 
//end of string 
    while (* tar->str != '\0') { 
    tar->str++; 
    } 
//int i = 0; 
//copy string 
    while (*source->str != '\0') { 
    *tar->str = *src->str; 
    *tar->str++; 
    *src->str++; 
    // i++; 

    } 
return tar; 
} 
+1

'source'は何ですか? – MikeCAT

+0

このコードには問題がありますが、私はそれを完全に取り除き、最初から書き直すことをお勧めします。 – Hurkyl

+0

'tar-> str ++'と 'src-> str ++'から '*'を削除します。あなたは '計算された値が使われていないか'それとも同様のものについての警告を受け取るべきです。 –

答えて

2

修正する前にポインタをコピーしてください。私はtar->strを変更することは、文字列が始まるところの情報を破壊するので有害かもしれないと思います。

String * String_Combine(String * tar, const String * src) { 
    char * tar_str = tar->str, * src_str = src->str; 
    //end of string 
    while (* tar_str != '\0') { 
    tar_str++; 
    } 
    //int i = 0; 
    //copy string 
    while (*src_str != '\0') { /* assuming that "source" is a typo and it should be "src" */ 
    *tar_str = *src_str; /* with hope that there is enough writable buffer allocated */ 
    tar_str++; 
    src_str++; 
    // i++; 

    } 
    //terminate string 
    *tar_str = '\0'; 
    return tar; 
} 
+0

'* tar_str = '\ 0';'行を削除する必要がありましたが、正常に動作します。 –

0

2つのこと:

  1. 両方tar-> STRとsrc-> STR
  2. ストアポインタタール/ src-> STRあなたが保持strto> tar-のための十分なメモリを割り当てることを確認してください局所的に反復して、元のstrへのポインタを失わないようにします。

あなたは簡単にそれを理解するために、私はテストケースを書いた;)

#include <iostream> 
#include <string.h> 
struct String { 
    char* str; 
}; 
using namespace std; 
String * String_Combine(String * tar, const String * src) { 
// take a local copy of strs 
char* tar_str = tar->str; 
char* src_str = src->str; 
//end of string 
while (* tar_str != '\0') { 
    tar_str++; 
} 

//int i = 0; 
//copy src string to tar string 
    while (*src_str != '\0') { 
    *tar_str = *src_str; 
    *tar_str++; 
    *src_str++; 
    // i++; 

    } 
return tar; 
} 
int main() 
{ 
    String* src = (String*) malloc(sizeof(String)); 
    src->str = new char[20]; 
    strcpy(src->str, "World!"); 

    String* tar = (String*) malloc(sizeof(String)); 
    tar->str = new char[20]; 
    strcpy(tar->str, "Hello "); 
    String* result = String_Combine(tar,src); 

    cout << result->str << endl; 

    return 0; 
} 
関連する問題