2017-06-17 12 views
-3

トピックとして問題があります。char配列をchar配列にコピーする

マイコード:バッファに

struct message{ 
    char sender_name[20]; 
    char dest_name[20]; 
    char content_message[256]; 
}; 

int main() { 
message tmp; 

printf("Enter your name\n"); 
std::cin>>tmp.sender_name; 

printf("Enter dest name\n"); 
std::cin>>tmp.dest_name; 

printf("Enter message to %s \n",tmp.dest_name); 
std::cin>>tmp.content_message; 

memcpy(&buffer, &tmp,sizeof(tmp)); 

printf("MEASAGE: %s\n",buffer); 

return EXIT_SUCCESS; 
} 

のみtmp.sendernameであり、私はそれを修正する方法がわかりません。 私は多くの話題を読むが、私はそれを修正することはできない。

お願いします。

+3

'buffer'とは何ですか? – tkausl

+1

なぜあなたは 'printf(" MEASAGE:%s \ n "、buffer);があなたのメッセージを構造化された方法で印刷すると思いますか?最初に遭遇した ''\ 0''文字で停止します。 –

+0

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

答えて

1

それをコピーするすべてのもの、あなたはそれが間違ってアクセスしている:

#include <iostream> 
#include <cstdlib> 
#include <cstring> 
using namespace std; 
struct message{ 
    char sender_name[20]; 
    char dest_name[20]; 
    char content_message[256]; 
}; 
char buffer[sizeof(message)]; 

int main() { 
    message tmp; 

    printf("Enter your name\n"); 
    std::cin>>tmp.sender_name; 

    printf("Enter dest name\n"); 
    std::cin>>tmp.dest_name; 

    printf("Enter message to %s \n",tmp.dest_name); 
    std::cin>>tmp.content_message; 

    memcpy(&buffer, &tmp,sizeof(tmp)); 

    message *cpy = reinterpret_cast<message*>(buffer); 
    printf(
     "sender_name: '%s\n'" 
     "dest_name: '%s\n'" 
     "content_message: '%s\n'", 
     cpy->sender_name, 
     cpy->dest_name, 
     cpy->content_message 
    ); 

    return EXIT_SUCCESS; 
} 

テスト:

g++ buffer.cc && printf '%s\n' foo bar baz | ./a.out 

出力:

Enter your name 
Enter dest name 
Enter message to bar 
sender_name: 'foo 
'dest_name: 'bar 
'content_message: 'baz 
' 

また、ところで、おそらくない良い方法charバッファに読み込みます。このAPIで範囲チェックをすることはほとんどできません(ちょうど配列とは対照的にポインタで動作するように見えるので)。これはgetsのように安全ではないと思います。また、文書化されていないようです(http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt)、gccとclangのうちgccだけがそれを受け入れます。

+0

間違ったcppreferenceページ:演算子>> to charポインタはhttp://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2で、[std :: setw](http:// en.cppreference.com/w/cpp/io/manip/setw)から範囲を確認する – Cubbi

関連する問題