[英]how to print a char from struct
有人可以告訴我們在接收數據作為結構時打印一個字符嗎? 這是一個例子:
...
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");
...
謝謝你的回復 -
printf("x3 = %s\n", data_rcv.x3);
應該
printf("x3 = %c\n", data_rcv.x3);
在您的示例中, x3
不是char
- 它是指向char
的指針。 在大多數情況下,指針值僅在它們最初屬於的過程中有意義。 如果通過套接字將指針值發送到另一個進程,則接收進程通常不能使用它。
你可能想要做的是發送一個char
數組(或者可能只是一個char
,很難從你的問題中得知) - 所以你的struct
應該是這樣的:
struct rcv {
int x1;
float x2;
char x3[LENGTH];
};
或者可能:
struct rcv {
int x1;
float x2;
char x3;
};
(如果使用第二種形式,則需要在printf
格式字符串中使用%c
而不是%s
)。
作為一個額外的想法,您應該記住,如果您發送的進程不是使用相同的編譯器編譯並且針對相同的體系結構,那么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);
%s
嘗試打印以null結尾的字符串,並期望該參數為char
指針。 相反,它獲得了一個char
值(並且由於所有現代機器上的指針都大於一個char
,它之后也會得到一些垃圾),這非常糟糕 。
相反,你應該使用%c
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.