如何正确使用snprintf将信息格式化为缓冲区,并使用sscanf来获取该信息

时间:2015-04-04 07:38:16

标签: c printf scanf

我想将不同类型的变量存储到char数组的缓冲区中,以便我可以发送它,当服务器收到它时,我想采用那个格式化的缓冲区并获取变量。

我找到了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,要么是段错误,要么无效,等等。

同样,我希望这是一种在将数据从TCP客户端发送到服务器之前序列化数据的方法,但是如果不发送它,我甚至无法完成这项工作。

不起作用的部分是sscanf。我已经阅读了我发现的特别是谷歌搜索的所有内容

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

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

但是我有一些东西显然不见了

编辑:因为我在这,我看到很多评论和博客告诉我不要使用sscanf,请问解决这个问题的正确方法是什么?因为我看到的每一个例子都使用1或2个字符*而且它根本没有帮助我

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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,以便我可以存储信息。像这样的东西