[英]split array of char with delimiter '#' and save in another array
I have a problem. 我有个问题。 I receive a response from a server as an array of chars.
我收到来自服务器的响应(字符数组)。 Ex:
555#200#
. 例如:
555#200#
。 I split the array into 555
and 200
because that is my command. 我将数组分为
555
和200
因为这是我的命令。 I want to save that command to another array but I get bad results. 我想将该命令保存到另一个数组,但结果不理想。 Here's my code:
这是我的代码:
void READ_FROM_SERVER(void) {
int read_vkluci = read(sock_descriptor, read_from_server, sizeof(read_from_server));
if (read_vkluci < 0)
printf("Failed reading bytes from server\n");
printf(" %s \n", read_from_server);
if(read_vkluci>0){
char** tokens;
printf("naredbi=%s \n\n", read_from_server);
tokens = str_split(read_from_server, '#');
if (tokens){
int i;
for (i = 0; *(tokens + i); i++){
printf("naredba=%s\n", *(tokens + i));
naredbi_odelno[i]= *(tokens + i);
printf("naredba_odelno=%s\n", naredbi_odelno[i]);
brojnacomandi++;
//free(*(tokens + i));
}
printf("\n");
//free(tokens);
}
}
int p;
for(p=0;p<brojnacomandi;p++){
if (naredbi_odelno[p]==201) {
nadvoresna_komanda = VKLUCI;
printf("VKLUCEN UVLEKUVAC!!!!");
}
if (naredbi_odelno[p]==200) {
nadvoresna_komanda = ISKLUCI;
printf("ISLKUCEN UVLEKUVAC!!!!");
}
if (naredbi_odelno[p]==96) {
printf("TCP_CONN_OK!!!\n");
}
if (naredbi_odelno[p]==211) {
makeTXpaket(STACK_1);
p_tx_buffer_ = &tx_buffer[1];
nbytes = write(fd, tx_buffer, *p_tx_buffer_);
if (nbytes != tx_buffer[1]) {
/* problem! */
printf("error writing on serial port!!!");
}
printf("PRIMAM....\n");
isprateno=0;
}
if (naredbi_odelno[p]==210) {
makeTXpaket( RETURN);
p_tx_buffer_ = &tx_buffer[1];
nbytes = write(fd, tx_buffer, *p_tx_buffer_);
if (nbytes != tx_buffer[1]) {
/* problem! */
printf("error writing on serial port!!!");
}
printf("VRAKAM....\n");
isprateno=0;
}
// else {
// printf("TCP_NOT_OK!!!!\n");
// close(sock_descriptor);
// CONECT_T0_SERVER();
// }
Clean_read_from_server_buff();
Clean_naredbi_odelno();
}
}
char** str_split(char* a_str, const char a_delim){
char** result = 0;
size_t count = 0;
char* tmp = a_str;
char* last_comma = 0;
/* Count how many elements will be extracted. */
while (*tmp){
if (a_delim == *tmp){
count++;
last_comma = tmp;
}
tmp++;
}
/* Add space for trailing token. */
count += last_comma < (a_str + strlen(a_str) - 1);
/* Add space for terminating null string so caller
knows where the list of returned strings ends. */
count++;
result = malloc(sizeof(char*) * count);
if (result){
size_t idx = 0;
char* token = strtok(a_str, "#");
while (token){
assert(idx < count);
*(result + idx++) = strdup(token);
token = strtok(0, "#");
}
assert(idx == count - 1);
*(result + idx) = 0;
}
return result;
}
The server sends me only 555#, but I get in naredba_odelno
bad result! 服务器仅向我发送555#,但是我收到
naredba_odelno
错误的结果! Any idea why that is happening? 知道为什么会这样吗?
How do I make naredba_odelno
= naredba
because naredba
is good! 我如何使
naredba_odelno
= naredba
因为naredba
很好!
output: 输出:
naredbi=555#
naredba=555
naredbi_odelno=
...... bad results why? naredbi_odelno=
......不良结果为何?
My first guess is that you're reading off the end of the input data. 我的第一个猜测是,您正在读取输入数据的末尾。 Note that
read
does not nul-terminate the string, so your printf
statement is immediately broken. 请注意,
read
不会使字符串nul终止,因此您的printf
语句将立即中断。
Try this: 尝试这个:
int read_vkluci = read(sock_descriptor, read_from_server, sizeof(read_from_server)-1);
and this 和这个
read_from_server[read_vkluci] = '\0';
printf("naredbi=%s \n\n", read_from_server);
BTW, sizeof(read_from_server)
will only work correctly if read_from_server
is an array type. 顺便说一句,
sizeof(read_from_server)
仅在read_from_server
是数组类型时才能正常工作。 If it's a pointer to a buffer then that's broken too. 如果它是一个指向缓冲区的指针,那么它也会被破坏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.