2012-11-25 3 views
-1

이 문자열 "09195462965"을 int로 변환하려고하는데 문제가 있습니다. 내 코드의linux C 문자열을

조각은 :

int n, p, pnum=0; 
char buffer[256]; 
char *endptr; 
long pnumber; 

bzero(buffer,256); 
p = read(sock,buffer,255); 

    pnumber = strtol(buffer, &endptr, pnum); 

printf("n: %ld",pnumber); 

p = write(sock,buffer,sizeof(buffer)); 

클라이언트는 "09195462965"의 캐릭터가 다음 서버를 송수신합니다.

이제 문자열을 int09195462965으로 변환해야합니다.

참고 : 서버는 숫자를 문자열로 보냅니다.

+3

그리고 문제는 무엇입니까? –

+1

문제는 무엇인가? –

+0

int의 최대 크기가 09195462965보다 크지 않다고 생각합니다. – cipher

답변

3

strtol()을 잘못 사용하고 있습니다. 마지막 매개 변수는 원하는 기반이어야합니다. 예를 들어, 당신은 기본 10 (10 진수)에서 해당 번호를 저장하려면 :

long pnumber; 
pnumber = strtol("09195462965", NULL, 10); //nst char *nptr is "09195462965" 
              //char **endptr is null 
              //int base  is 10 for decimal 
printf("n: %ld",pnumber); 

>> 9195462965 

당신이 사용하고있는 기능에 대한 man page 읽을 수 있는지 확인합니다.

수에 당신이 전달하고 있기 때문에, "0"다시 침을 일으키는 당신의 마지막 매개 변수에 대한 일을로 (0로 설정된) pnum 전달.

09195462965는 0-에서 숫자를 가지고 당신이 "0"다음 strtol()로는 첫 번째 0를 볼 것를 전달하고 숫자 8 진수를 가지고 취급 경우 9 (그래서 당신 12 월을 원 가정), 그의 문제는 8 진수는, 따라서, 0-7에서 갈 것입니다 9는 8 진수로 '범위를 벗어났습니다. 따라서 strtol()은 0으로 돌아갑니다.

숫자가 07175462765 인 경우 괜찮습니다. 0시 pnum을 전달합니다.

+1

* base 값이 0이면 대상 시퀀스의 예상 형식은 [...]에서 설명한대로 정수 상수의 형식입니다. * 그래서' base = 0'이 숫자가 8 진수로 해석 될 경우 op가 뒤에 오는 것일 수 있습니다. 당신이 당신의 대답에 게시 때문에 난 단지 *** 당신이 사람이 페이지를 ... *** 읽을 수 있는지 확인 견적을 추가) – cnicutar

+0

@cnicutar을 -이 걱정 오, 난 그냥 둘 다 설명하지 않았다 * 왜 * 그 나는 영업 이익은 매뉴얼 페이지를 읽고 그것을 알아낼 것이라고 가정으로 문자열,'PNUM = 0 '으로 잘못되었습니다. ;)하지만 지금은 업데이트했습니다. – Mike

1

크기가 너무 커서 int에 적합하지 않습니다. strtoumax을 시도하고 uintmax_t에 저장하십시오. 당신이하지 않은 경우

uintmax_t pnumber = strtoumax(buffer, &endptr, 10); 
if (pnumber == UINTMAX_MAX && errno == ERANGE) 
    /* Too big. */ 

또는 strtoumax 당신은 strtoull 등을 시도 할 수 있습니다.