简体   繁体   English

用定界符'#'分割char数组并保存在另一个数组中

[英]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. 我将数组分为555200因为这是我的命令。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM