2012-05-17 1 views
3

만 간단한 번호를 가져옵니다 : 내가 그 같은 기능 <code>stoi</code>를했습니다 C/C++

static int *stoi(const char *c) { 
    int *r = new int[2]; 
    r[1] = sscanf(c, "%d", &r[0]); 
    return r; 
} 

내가 예를 들어 c = "a5"을 제공

, 그것은 작동하지 않습니다.

내가 c = "543336535"을 주면 작동합니다.

하지만 c = "45sdfff-sdbsdf esg5sq4f"을 줄 때 그것은 r[0] = 45를 반환하고, 내가 원하는하지 않는

나는 단지 내 함수는 숫자 전용 문자열을 읽고 싶은 몇 가지 숫자가 아닌 문자 ... 45 후이 있기 때문에 .

+3

_single_ 언어 선택 - C 또는 C++? – ildjarn

+0

C, C, else, C++에서 가능하면 누구나 가능합니다. – gnidmoo

+0

'new int [2]'는 C++에서 좋지 않은 스타일이고'std :: array' 또는'std :: vector'를 사용합니다. – Fanael

답변

5

당신이 이미 가지고있는 코드에 대한 최소한의 변화를 들어, sscanf%n 기능을 사용할 수 있습니다 : 문자열의 길이보다 작은

int chars_read; 
r[1] = sscanf(c, "%d%n", &r[0], &chars_read); 

chars_read 경우, sscanf 소비하지 않았다을 모든 문자가 포함되어 있으므로 문자열은 전적으로 단일 정수로 구성되지 않았습니다.

The Linux documentation for scanfTechnical Corrigendum 1에 의해 도입 된 추가 예제가 표준과 모순된다는 것을 지적하지만 그 동안 표준은 충돌을 해결하기 위해 업데이트되었습니다. 다음은 발생할 수있는 sscanf 구현 불확실한 행동의 얼굴에 결과를 해석하는 방법은 다음과 같습니다 당신이 C를 사용하는 경우, 당신은 당신이 임시 변환을 부를 수있는 것을 할 strtol을 사용할 수 있습니다

switch (r[1]) { 
    case EOF: // empty string 
    break; 
    case 0: // doesn't start with numeric characters 
    break; 
    case 1: // starts with number; sscanf follows standards 
    case 2: // starts with number; sscanf follows TC1 
    if (c[chars_read] == '\0') 
     r[1] = 1; // we read entire string 
    else 
     r[1] = 0; // didn't read entire string; pretend we read nothing 
    break; 
    default: // shouldn't happen 
    assert(FALSE); 
} 
+0

고마워 이제 작동합니다. – gnidmoo

+0

['scanf'맨 페이지] (http://linux.die.net/man/3/scanf)는'% n' 형식의 scanf 리턴 값 사용에 대해 경고합니다. 'r [1] = (chars_read == strlen (c))'를 설정하는 것이 더 나을 수도 있습니다. – Dave

+0

고맙습니다. @Dave. 나는 나의 개정이 지금 모든 것을 다 다루고 있다고 생각한다. 그렇지 않은 경우 편집하십시오. –

3

. 변환 할 수있는 데이터의 끝을 가리키는 포인터를 제공합니다. 그것이 문자열의 끝이 아니라면, 변환 할 수있는 모든 것을 따라 가면서 적어도 약간의 가비지를 가졌습니다.

C++을 사용하는 경우 Boost lexical_cast을 사용하는 것이 좋습니다. 전체 입력이 대상 유형으로 변환되었지만 변환되지 않은 경우 예외가 발생하는 경우 성공합니다.