как распечатать символ из структуры - PullRequest
3 голосов
/ 12 марта 2010

Может кто-нибудь сказать нам распечатать символ при получении данных в виде структуры? Вот пример:

...
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");
...

Спасибо за ваши ответы-

Ответы [ 3 ]

6 голосов
/ 12 марта 2010

В вашем примере 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);
6 голосов
/ 12 марта 2010
printf("x3 = %s\n", data_rcv.x3);

должно быть

printf("x3 = %c\n", data_rcv.x3);
4 голосов
/ 12 марта 2010

%s пытается вывести строку с нулевым символом в конце и ожидает, что параметр будет указателем char. Вместо этого он получает значение char (а так как указатель на всех современных машинах больше, чем char, он также получает немного мусора после него), что очень плохо .

Вместо этого вы должны использовать %c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...