2016-05-29 18 views
0

次の2つのコードを見て、最初のコードが動作し、もう1つが動作しない理由を教えてください。なぜ簡単なchar *が機能しないのですか?

最初のコード(ワーキング):

#include <iostream> 
#include <string.h> 

using namespace std; 

char* getCoordinates(char* AndroidID) 
{//Access the database and get the South Latitude value 
    //This is here is dummy data for testing 
    const char* S = "27.19122859"; 
    const char* N = "27.19245011"; 
    const char* W = "31.17657602"; 
    const char* E = "31.17657602"; 
    char X[100]=""; 
    strncat(X, "S", 1); 
    strncat(X, S, strlen(S)); 
    strncat(X, "N", 1); 
    strncat(X, N, strlen(N)); 
    strncat(X, "W", 1); 
    strncat(X, W, strlen(W)); 
    strncat(X, "E", 1); 
    strncat(X, E, strlen(E)); 
    char* Y = X; 
    cout<<Y; 
    return Y; 
} 
int main() 
{ 
    char* sda=NULL; 
    getCoordinates(sda); 
    return 0; 
} 

これは正しく私が

S27.19122859N27.19245011W31.17657602E31.17657602

しかしときを構成する文字列を出力します私は同じことをやろうとしますが、main()の戻り値をプリントアウトすると、ちょっと変わってきます 2番目のコード(動作していません)

#include <iostream> 
#include <string.h> 

using namespace std; 

char* getCoordinates(char* AndroidID) 
{//Access the database and get the South Latitude value 
    //This is here is dummy data for testing 
    const char* S = "27.19122859"; 
    const char* N = "27.19245011"; 
    const char* W = "31.17657602"; 
    const char* E = "31.17657602"; 
    char X[100]=""; 
    strncat(X, "S", 1); 
    strncat(X, S, strlen(S)); 
    strncat(X, "N", 1); 
    strncat(X, N, strlen(N)); 
    strncat(X, "W", 1); 
    strncat(X, W, strlen(W)); 
    strncat(X, "E", 1); 
    strncat(X, E, strlen(E)); 
    char* Y = X; 
    return Y; 
} 

int main() 
{ 
    char* sda=NULL; 
    char* T=getCoordinates(sda); 
    cout<<T; 
    return 0; 
} 

この出力:

S27。 N27.19245011W31.`%@ \╞G■■)

ここで問題は何ですか?

+0

なぜstd :: stringを使用していないのですか? –

+0

[コンパイラがこれを解決できた可能性があります](http://coliru.stacked-crooked.com/a/69795df051f4d148) – chris

+0

ありがとうございました:) –

答えて

1

charの配列にポインターを戻していますが、関数の存続期間の長さに限ります。関数が返るとき、配列はもはや有効ではありません。

+0

ありがとう:)私は文字列でそれをやろうとしますその文字列を別の関数への入力として必要なchar *に変換します。 –

+0

@SamerBastawy 'std :: string'から' c_str() 'を使うことができます。 –

1

関数getCoordinatesは、関数getCoordinatesのローカルスコープを持つバッファへのポインタを返し、関数が復帰した後に破棄されるため、動作しません。 charの代わりにstd :: stringを使用すると、動作します。

+0

ありがとうございます。感謝します –

関連する問題