2017-09-21 9 views
-1

C 소켓 recv 함수에서 이와 같은 문자열을 얻었으며이를 처리하고 문자 (S, L, E ...) 옆에있는 숫자 값을 얻는 방법을 알려주십시오. 문자열recv return 처리 방법

[email protected]@L1550 @W 
>E0578A9069C0000 
>S0223W0418 
>R2219H1429S0000 
>G0156V0116T1800 
>m0138 
>m0087 

예를 들어 문자는 숫자 223을 가져올 필요가 있고 다른 문자는 같아야합니다.

루프를 수행하고 모든 벡터를 읽고 키워드를 확인하려고 생각하고있었습니다. 그러나 어떤 방법이 더 쉽고 빠르지는 확실하지 않습니다.

+0

100 % 명확하지 않으므로 문제를 조금 더 설명하십시오. – Idan

+0

@ 아이단 나는이 문자열을 recv 함수에서 얻었으므로 값을 가져와야합니다. 값 영역은 문자 다음에 오는 숫자입니다 (예 : E, 57을 가져와야 함, W에서 418을 가져와야 함). 명확한가요? – antoniogbn

+0

그것이 네트워크 스트림이라면 char-by-char 상태 머신과 함께 갈 것입니다. –

답변

0

같은 적절한 기능을 사용하여 등을 digits_char_array 변환합니다. 실행하면

/* SO 4635-2633 */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char data[] = 
     "[email protected]@L1550 @W\n" 
     ">E0578A9069C0000\n" 
     ">S0223W0418\n" 
     ">R2219H1429S0000\n" 
     ">G0156V0116T1800\n" 
     ">m0138\n" 
     ">m0087"; 
    const char digits[] = ""; 

    printf("Raw data:\n[%s]\n", data); 

    size_t offset = 0; 
    size_t skip; 
    //for (skip = strcspn(data + offset, digits); 
    //  data[skip] != '\0'; 
    //  skip = strcspn(data + offset, digits)) 
    while (data[(skip = strcspn(data + offset, digits))] != '\0') 
    { 
     size_t len = strspn(data + offset + skip, digits); 
     if (len == 0) 
      break; 
     char numstr[32]; 
     memmove(numstr, data + offset + skip, len); 
     numstr[len] = '\0'; 
     int number = atoi(numstr); 
     printf("Number %4d (position %2zu..%-2zu - [%.*s])\n", 
       number, offset + skip, offset + skip + len - 1, 
       (int)len, data + offset + skip); 
     offset += skip + len; 
    } 

    return 0; 
} 

, 출력은 다음과 같습니다

Raw data: 
[[email protected]@L1550 @W 
>E0578A9069C0000 
>S0223W0418 
>R2219H1429S0000 
>G0156V0116T1800 
>m0138 
>m0087] 
Number 1550 (position 6..9 - [1550]) 
Number 578 (position 16..19 - [0578]) 
Number 9069 (position 21..24 - [9069]) 
Number 0 (position 26..29 - [0000]) 
Number 223 (position 33..36 - [0223]) 
Number 418 (position 38..41 - [0418]) 
Number 2219 (position 45..48 - [2219]) 
Number 1429 (position 50..53 - [1429]) 
Number 0 (position 55..58 - [0000]) 
Number 156 (position 62..65 - [0156]) 
Number 116 (position 67..70 - [0116]) 
Number 1800 (position 72..75 - [1800]) 
Number 138 (position 79..82 - [0138]) 
Number 87 (position 86..89 - [0087]) 

당신은 strcspn()에 대한 호출을 복제의 비용으로 while 루프 대신에 for 루프를 사용할 수 있습니다. 나는 자신을 반복하지 않는 것을 선호했다.

+0

귀하의 논리가 잘 작동하지만 문자열에 값을 나열하고 내가 뭘하려고하는 방법은 문자열에서 값을 얻을 변수에 저장됩니다. 예를 들어 E (057) 이후의 값은 var1에 저장되고 S, A, C와 같은 다른 값과 동일하게 저장됩니다. – antoniogbn

+0

그리고 값을 저장하는 데 문제가 있습니까? 'var1','var2', ...'var14'와 같은 이름을 사용하는 것은 고통스럽고 배열 요소로 대체되어야한다는 사실 외에도'arr [0]','arr [1]', ...'arr [ 13]'? 번호 앞에 편지를 가져 가야 할 필요가 있다면 그렇게 할 수 있습니다. –

+0

값을 저장하는 것이 문제가 아니라 논리가 숫자가 아닌 문자를 기반으로한다고 말하는 것만은 아닙니다. 지금까지 (그리고 내가 틀렸다면 미안하다) 숫자 값을 찾는 문자열을 물마루로 보았을 까? 올바른 길은 글자를 찾는 문자열을 따라 가야한다고 생각합니다. 코드는 물마루가 흘러가는 것과 같을 것입니다. 그리고 E를 발견하면, "ops가 E를 찾았고 varx 나 var [0]에 후속 값을 저장하고 문자열의 끝까지 검색을 계속합니다. ur 코드가 잘못되었다는 것을 말하는 것이 아니라, 필요한 코드로 직접 코드를 작성하려고합니다. – antoniogbn

1

일반적인 아이디어를 설명하고 직접 작성하겠습니다.

  1. 전체 문자열을 포함하는 char 버퍼를 만듭니다.
  2. 크기가 5 인 각 문자 수의 숫자로 다른 문자 버퍼를 만듭니다.이 문자를 digits_char_array라고합니다.
  3. char 버퍼를 통해 루프에서 실행하고 현재 char이 문자 인 경우 다음 4 개의 문자를 digits_char_array에 복사하십시오. strncpy 또는 memcpy를 사용할 수 있습니다.
  4. 이 코드는 작업을 수행하는 방법을 보여줍니다 atol