有人可以告诉我们在接收数据作为结构时打印一个字符吗?这是一个例子:
...
struct rcv{
int x1;
float x2;
char *x3;
};
rcv data_rcv;
...
if (recv(socket, &data_rcv, sizeof(data_rcv), 0) < 0)
printf("recv() failed");
...
printf("x1 = %d\n", data_rcv.x1);
printf("x2 = %f\n", data_rcv.x2);
printf("x3 = %s\n", data_rcv.x3); // it doesn't print anything, why?
...
让我们假设x3是通过套接字传输的字符串,如下所示:
...
char *str1="data-of-app.1"
struct snd{
int x1;
float x2;
char *x3;
};
snd data_snd;
...
data_snd.snd = str1;
...
if (send(socket, &data_snd, sizeof(data_snd), 0) < 0)
printf("send() failed");
...
感谢您的回复 -
答案 0 :(得分:6)
printf("x3 = %s\n", data_rcv.x3);
应该是
printf("x3 = %c\n", data_rcv.x3);
答案 1 :(得分:6)
在您的示例中,x3
不是char
- 它是指向char
的指针。在大多数情况下,指针值仅在它们最初属于的过程中有意义。如果通过套接字将指针值发送到另一个进程,则接收进程通常不能使用它。
你可能想要做的是发送一个char
(或者可能只是一个char
的数组,这很难从你的问题中得知) - 所以你的struct
应该看起来像:
struct rcv {
int x1;
float x2;
char x3[LENGTH];
};
或者也许:
struct rcv {
int x1;
float x2;
char x3;
};
(如果您使用第二种表单,则需要在%c
格式字符串中使用%s
而不是printf
。
作为一个额外的想法,你应该记住,如果你发送的进程没有使用相同的编译器编译并且针对相同的体系结构,那么struct
本身的大小和布局就像和个别成员一样,不太可能匹配,你会收到垃圾。
在评论中回答你的问题:
您应该在发送方和接收方都使用相同的struct
定义。如果您有这样的结构:
#define N 100
struct rcv {
int x1;
float x2;
char x3[N];
};
...并且您希望将字符串放入x3
成员,只需使用strcpy
(或更好,strncat
):
struct rcv data;
data.x3[0] = 0;
strncat(data.x3, some_string, N - 1);
答案 2 :(得分:4)
%s
尝试打印以null结尾的字符串,并期望该参数为char
指针。相反,它获得char
值(并且由于所有现代机器上的指针都大于char
,它之后也会有一些垃圾),这是非常糟糕的
相反,您应该使用%c
。