我想将不同类型的变量存储到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个字符*而且它根本没有帮助我
答案 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,以便我可以存储信息。像这样的东西