2015-04-04 2 views
0

Я хочу хранить различные типы переменных в буфере для массива символов, чтобы я мог отправлять его, и когда сервер получает его, я хочу взять этот отформатированный буфер и вернуть переменные.Как правильно использовать snprintf для форматирования информации в буфер и sscanf для получения этой информации.

Я нашел 0 примеров того, как сделать эту работу, каждый заставляет ее выглядеть такой простой задачей, что они не обеспечивают выход, поэтому я попробовал это для себя.

Я сделал туманную программу, в которой храню и извлекаю, даже не отправляя, чтобы привыкнуть к форматам и избегать всех проблем, которые я прочитал о переполнении буфера и еще много чего.

int main(int argc, char *argv[]) { 
int op=1;//1 porque es un alta 
int pid=getpid(); 
printf("pid %d\n", pid); 
char * tema=argv[1]; 
printf("Tema %s\n", tema); 

int longitud=strlen(tema)+sizeof(int)*2+1;/ 
printf("longitud %d\n", longitud); 

char mensaje[longitud]; 
char *ptr=mensaje; 

snprintf(ptr, longitud,"%d %d %s", op, pid,tema); 
printf("mensaje %s\n", mensaje); 

int opRecibido=0; 
int pidRecibido=0; 
char *temaRecibido; 
sscanf(mensaje, "%d %d %s", &opRecibido, &pidRecibido, temaRecibido); 

printf("temaRecibido %s\n", temaRecibido); 
printf("pidRecibido %d\n", pidRecibido); 
printf("opRecibido %d\n", opRecibido); 

} 

Конечно, я пробовал несколько итераций этого. Я не могу понять. temaRecibido либо пишет null, либо segfault, либо ничего не работает и т. д.

Опять же, я хочу, чтобы это как способ сериализации моих данных перед отправкой его с TCP-клиента на сервер, но я даже не могу выполнить эту работу , не отправляя его.

Часть, которая не работает, - это sscanf. Я прочитал все, что я нашел его специально прибегая к помощи

Since we have snprintf, why we don't have a snscanf?

и

How to send formatted string to socket using a small buffer?

Но есть то, что я явно не хватает

Edit: А так как я m на нем, и я вижу так много комментариев и блогов, говорящих мне не использовать sscanf, пожалуйста, каков был бы правильный способ решения этой позиции? Поскольку каждый пример я вижу работы с 1 или 2 символ * и это просто не помогает мне

ответ

0

Этот int longitud=strlen(tema)+sizeof(int)*2+1;/ должен был

int longitud=strlen(tema)+sizeof(int)*2+1 + 2;// +2 for additional space induced between the types. 

дополнительные два байта отсюда

snprintf(ptr, longitud,"%d<space>%d<space>%s", op, pid,tema);

+0

не сказал, что это не так (я бы никогда не догадался, что это будет так благодарно), но при попытке использовать sscanf я все еще получаю ошибку сегментации. – keont

+0

Теперь, когда это работает, я получаю три переменных, напечатанных, это работает с +1 и +2. И не знаю, почему. Если я ничего не добавлю, я пропускаю последнего персонажа, что имеет смысл. Просто хотел добавить, что – keont

0

Хорошо, поэтому я сделал это, получив идеи откуда-то, и я считаю, что это работает:

int main(int argc, char *argv[]) { 
int op=1;//1 porque es un alta 
int pid=getpid(); 
printf("pid %d\n", pid); 
char * tema=argv[1]; 
printf("Tema %s\n", tema); 

int longitud=strlen(tema)+sizeof(int)*2+2; 
printf("longitud %d\n", longitud); 

char mensaje[longitud];//crea array tamaño deseado: tamanio del nombre del tema recibido mas los dos int a enviar 
char *ptr=mensaje; 

int nbytes = longitud; 
char *my_string; 
my_string = (char *) malloc (strlen(tema) + 1); 

snprintf(mensaje, longitud,"%d %d %s", op, pid,tema); 
printf("mensaje %s\n", mensaje); 
printf("my_string %s\n", my_string); 


int opRecibido=0; 
int pidRecibido=0; 
sscanf(mensaje, "%d %d %s", &opRecibido, &pidRecibido, my_string); 

printf("pidRecibido %d\n", pidRecibido); 
printf("opRecibido %d\n", opRecibido); 
printf("myString %s\n", my_string); 

} 

Итак, в основном, делая malloc соответствующего размера, чтобы я мог хранить информацию. Что-то вроде этого

Смежные вопросы