같은 적절한 기능을 사용하여 등을 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
루프를 사용할 수 있습니다. 나는 자신을 반복하지 않는 것을 선호했다.
100 % 명확하지 않으므로 문제를 조금 더 설명하십시오. – Idan
@ 아이단 나는이 문자열을 recv 함수에서 얻었으므로 값을 가져와야합니다. 값 영역은 문자 다음에 오는 숫자입니다 (예 : E, 57을 가져와야 함, W에서 418을 가져와야 함). 명확한가요? – antoniogbn
그것이 네트워크 스트림이라면 char-by-char 상태 머신과 함께 갈 것입니다. –