2016-05-16 11 views
0

私は、ネットワークからの文字列LOAD:07.09.30:-40.5&07.10.00:-41.7を受け取りました。Cでの文字列分割:2つの部分を区切る

私は(私は07.09.30持っている:-40.5 1回目)し、「&」に基づいて分離、それはLOAD:タイプであることを検出する必要があります(文字列としてそれを維持)07.09.30を分離し、その後

とし、 -40.5(フロートに変換)。

フロートは-40.5ですが、07.09.30を文字列として保存する方法が見つかりません。コードの下

出力Iが分離し07.09.30一部を保存することができますどのように

tilt angle -40.50 
tilt angle -41.70 

を示して?ソリューションを提供する前に

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    char p[]="LOAD:07.09.30:-40.5&07.10.00:-41.7"; 
    char loadCmd[]="LOAD:"; 
    char data[]=""; 
    int ret; 
    int len=strlen (p); 
    int i=0, j=0; 

    if (!(ret = strncmp(p, loadCmd, 5))) 
    { 
     //copy p[5] to p[len-1] to char data[] 
     for (i=5;i<len;i++){ 
     data[j++]=p[i]; 
     } 
     data[j]='\0'; 
     char *word = strtok(data, "&"); //07.09.30:-40 
     while (word != NULL){ 
     char *separator = strchr(word, ':'); 
     if (separator != 0){ 
      separator++; 
      float tilt = atof(separator); 
      printf("tilt angle %.2f\n", tilt); 
     } 
     word= strtok(NULL, "&"); 
     } 
    } 
    else { 
     printf("Not equal\n"); 
    } 
    return(0); 
} 
+0

1) 'charデータ[] = "";' - > 'charデータ【はsizeofのP] = "";' – BLUEPIXY

+1

に関連する非常に密接[Cでチャーのコンポーネントを分割する方法と浮動小数点数に変換する?](https://stackoverflow.com/questions/37216938/) - 同じOPです。しかし、これは異なっており、間違いなく良い質問です。 –

答えて

0
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

char *storeUpto(char *store, const char *str, char ch){ 
    while(*str && *str != ch){ 
     *store++ = *str++; 
    } 
    *store = '\0'; 
    return (char*)(ch && *str == ch ? str + 1 : NULL); 
} 

int main (void){ 
    char p[] = "LOAD:07.09.30:-40.5&07.10.00:-41.7"; 
    char loadCmd[] = "LOAD:"; 
    char date1[9], date2[9], tilt[10]; 
    float tilt1, tilt2; 

    if (!strncmp(p, loadCmd, 5)){ 
     char *nextp = storeUpto(date1, p + 5, ':'); 
     nextp = storeUpto(tilt, nextp, '&'); 
     tilt1 = atof(tilt); 
     nextp = storeUpto(date2, nextp, ':'); 
     //storeUpto(tilt, nextp, '\0'); 
     tilt2 = atof(nextp); 
     printf("date1:%s, tilt1:%.2f\n", date1, tilt1); 
     printf("date2:%s, tilt2:%.2f\n", date2, tilt2); 
    } 
    else { 
     printf("Not equal\n"); 
    } 
    return(0); 
} 
+0

コードをダンプしないでください。コメントを提供する。 – TisteAndii

2

、私は/コピー文字列を格納するための次のコードが奨励されていないことを指摘したいと思います。

char data[]=""; 
// other codes ... 
for (i=5;i<len;i++){ 
     data[j++]=p[i]; 
     } 

これは、スタック内のメモリを破壊します。上記のコードの後に​​laodCmdの中の値を印刷すると、何の意味が壊れているのか分かります。

文字列をコピーする前に必要なメモリを割り当てることをお勧めします。以下は、メモリを(動的に)割り当てる方法の1つです。

char *data = NULL; 
// other codes ... 
data = (char *)malloc((len-5+1)*sizeof(char)); 
// for-loop to copy the string 

これが変更されると、解決策は簡単になります。 whileループの中でcharの配列を定義し、ヒット ':'になるまで文字を1つずつ単語に割り当てます。例を以下に示す。

// inside the while-loop 
     char first_part[20]; 
     i = 0; 
     while (word[i] != ':') 
     { 
      first_part[i] = word[i]; 
      i++; 
     } 
     first_part[i] = '\0'; 
     printf("first part: %s\n", first_part); 
     // the rest of the code ... 
関連する問題