2013-08-22 53 views
1

我遇到問題。我收到來自服務器的響應作爲一個字符數組。例如:555#200#。我將數組拆分爲555200,因爲這是我的命令。我想將該命令保存到另一個數組,但是我得到了不好的結果。這裏是我的代碼:用分隔符'#'分隔char數組並保存在另一個數組中

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; 
} 

服務器發送僅555#我,但我在naredba_odelno壞的結果得到!任何想法爲什麼會發生?

我該如何製作naredba_odelno = naredba因爲naredba很好!

輸出:

naredbi=555#

naredba=555

naredbi_odelno= ......壞的結果,爲什麼?

+0

可能重複的[C拆分一個字符數組到不同的變量](http://stackoverflow.com/questions/10349270/c-split-a-char-array-into-different-variables) – Christoph

+1

你打擾使用一個調試器? – ams

+0

在debuger我看到'555',但十六進制值是改變!爲什麼? –

回答

0

我的第一個猜測是您正在讀取輸入數據的末尾。請注意,read不會終止該字符串,因此您的printf語句立即被破壞。

嘗試這種情況:

int read_vkluci = read(sock_descriptor, read_from_server, sizeof(read_from_server)-1); 

read_from_server[read_vkluci] = '\0'; 
printf("naredbi=%s \n\n", read_from_server); 

順便說一句,如果sizeof(read_from_server)read_from_server是一個數組類型才能正常工作。如果它是一個指向緩衝區的指針,那麼它也會被破壞。

+0

naredbi = 555# naredba = 555 naredba_odelno =任何符號不是555 –