我的主题有问题。
我的代码:
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,我不知道如何解决它。 我读了很多主题,但我无法修复它。
请求帮助。
答案 0 :(得分: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
'
另外,BTW,可能不是读取char缓冲区的好方法。使用此API几乎不可能进行任何范围检查(假设它似乎也可以使用指针而不仅仅是数组),这会使它与gets
一样不安全。它似乎也没有记录(http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt),并且在gcc和clang之外,只有gcc接受它。