我正在解析一个包含3个值的字符串,逗号分隔。我目前正在使用sscanf,这很好用。我想要做的是在解析字符串之后操作这些值,并将我的结果连接回我收到它的相同格式,并在每次读取和操作字符串后将其写回串行端口。我认为我遇到的问题是我在解析时将变量声明为浮点数,并且想知道如何将浮点数重新组合起来写入串行端口。我也遇到了变量实际写入缓冲区并发送出去的问题,但这是一个不同的故事。任何有关这方面的帮助将不胜感激。以下是我的样本:
do {
struct timeval timeout = {0,299500};
char c;
fd_set fds;
int ret1, ret2;
//Zero file descriptor set, then append all types.
FD_ZERO(&fds);
FD_SET(cmp_fd, &fds);
FD_SET(STDIN_FILENO, &fds);
ret1 = select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
if (ret1 == -1)
{
perror("select");
need_exit = 1;
}
else if (ret1 > 0)
{
if (FD_ISSET(cmp_fd, &fds))
{
do {ret2 = read(cmp_fd, &c, 1);}
while ((ret2 < 0 && errno == EINTR));
if (ret2 == 1)
{
data_str[cmp_ind] = c;
cmp_ind++;
if(c == '\n')
{
float press, temp, cond;
char strn;
int asdf = sscanf(data_str,"%f,%f,%f", &press, &temp, &cond);
strn = ("%f,%f, %f", press, temp, cond);
char ppri[3]
ppri[1]= [press+1.3,temp,cond];
ppri[2] = temp;
ppri[3] = cond;
printf("%f",ppri);
write(cmp_fd,ppri,sizeof(ppri)); /* <-- This is what I am trying to do*/
/*needed output is: "#####.##,#####.##, #####.##" */
bzero(data_str,100);
cmp_ind = 0;
printf("\r\n");
}
}
else if(ret2 == -1)
{
perror("read");
need_exit = 1;
}
}
if(FD_ISSET(STDIN_FILENO, &fds))
{
do {ret2 = read(STDIN_FILENO, &c, 1);}
while (ret2 < 0 && errno == EINTR);
if(ret2 == 1)
{
if(c == '\x01') {
need_exit = -1;
}
}
}
}
}
while (!need_exit);
答案 0 :(得分:0)
int asdf = sscanf(data_str,"%f,%f,%f", &press, &temp, &cond);
strn = ("%f,%f, %f", press, temp, cond);
我想上面你可能想要形成一个包含所有三个float变量的字符串,但实际上这是将cond
float值转换为strn
char ppri[3]
ppri
是一个包含3个字符的数组,除非每个float都是单个数字整数,否则在将它们转换为字符串后,实际上不能存储三个浮点值。但是,你也没有空间可以放三个逗号。
ppri[1]= [press+1.3,temp,cond];
这一行不会不惜任何代价编译,我不知道它是如何编译的。
ppri[2] = temp;
ppri[3] = cond;
声明了大小为3的char数组,你无法访问ppri[3]
,数组索引从0开始。
printf("%f",ppri);
由于ppri是一个数组,ppri存储第一个字符的地址。
write(cmp_fd,ppri,sizeof(ppri));
这将在fd指向的文件中写入3个字符。
我不确定你在这部分代码中想要做什么,这是我最初的观察,你可以看到代码中的其他错误,尝试修复它们。
但无论如何如果你想解析用逗号分隔的浮点数,那么你可以使用
float f1, f2, f2;
// read float values from string,
sscanf(data_str,"%f,%f,%f",&f1,&f2,&f3);
// modify the float value
f1 += 10;
// form the modified string again.
sprintf(data_str,"%f,%f,%f",f1,f2,f3);
并回写data_str