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

相关问题