如何从struct打印char

mak*_*ake 3 c sockets

有人可以告诉我们在接收数据作为结构时打印一个字符吗?这是一个例子:

...
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? 
...
Run Code Online (Sandbox Code Playgroud)

我们假设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");
...
Run Code Online (Sandbox Code Playgroud)

谢谢你的回复 -

小智 6

printf("x3 = %s\n", data_rcv.x3);
Run Code Online (Sandbox Code Playgroud)

应该

printf("x3 = %c\n", data_rcv.x3);
Run Code Online (Sandbox Code Playgroud)


caf*_*caf 6

在你的例子中,x3不是char- 它是指针char.在大多数情况下,指针值仅在它们最初属于的过程中有意义.如果通过套接字将指针值发送到另一个进程,则接收进程通常不能使用它.

你可能想要做的是发送一个数组char(或者可能只是一个char,很难从你的问题中得知) - 所以你struct应该看起来像:

struct rcv {
  int x1;
  float x2;
  char x3[LENGTH];
}; 
Run Code Online (Sandbox Code Playgroud)

或者可能:

struct rcv {
  int x1;
  float x2;
  char x3;
}; 
Run Code Online (Sandbox Code Playgroud)

(如果使用第二种形式,你将需要使用%c,而不是%sprintf格式字符串).

另外一个想法是,您应该记住,如果您发送的进程不是使用相同的编译器编译并且针对相同的体系结构,则struct自身的大小和布局以及各个成员的大小和布局,不太可能匹配,你会收到垃圾.


在评论中回答你的问题:

您应该struct在发送方和接收方都使用相同的定义.如果您有这样的结构:

#define N 100

struct rcv {
    int x1;
    float x2;
    char x3[N];
};
Run Code Online (Sandbox Code Playgroud)

...并且你想把一个字符串放入x3成员中,只需使用strcpy(或更好strncat):

struct rcv data;

data.x3[0] = 0;
strncat(data.x3, some_string, N - 1);
Run Code Online (Sandbox Code Playgroud)