将char数组复制到char数组

时间:2017-06-17 14:41:28

标签: c++

我的主题有问题。

我的代码:

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,我不知道如何解决它。 我读了很多主题,但我无法修复它。

请求帮助。

1 个答案:

答案 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接受它。