2017-06-17 56 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

什麼是「緩衝區」? – tkausl

+1

爲什麼你認爲'printf(「MEASAGE:%s \ n」,buffer);'會以結構化的方式打印你的消息?它會在遇到的第一個''\ 0''字符停止。 –

+0

歡迎來到Stack Overflow。請花些時間閱讀[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頁面:operator >>到char指針是http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2,它使用[std :: setw](http:// en.cppreference.com/w/cpp/io/manip/setw)進行範圍檢查 – Cubbi

相關問題