2013-08-16 11 views
0

문자 배열을 정수로 변환해야하는 프로그램을 작성 중입니다. 그러나 양의 정수를 사용하는 대신 모든 정수 (물론 int 유형의 기능 범위)의 모든 잠재력 (예 : 양수, 음수 및 0)을 활용해야합니다. 하지만 나는 약간의 감시 가치, 즉 에 접근 할 필요가있다.int 내에서 매우 바람직하다. 나는 모든 것을 만들 필요가 없다. float 그래서 나는 그것을 피할 수 있다면, 하나의 정수가 아닌 센티넬을 사용할 수있다. C : 부호있는 정수 sentinel 값?

난 그냥 다음 "트릭"사용하고, 일시적으로이 문제를 해결하기 위해 : ( token 배열이) 프로그램의 나머지 그래서

int TokenToInt(char token[]) 
{ 
    int current=0, value=0; 
    char isNeg = 'F'; 

    if (token[current] == '-') { 
     isNeg = 'T'; 
     current++; 
    } 

    while (1) { 
     if (isdigit(token[current]) == 0) 
      return -1; 
     else { 
      value *= 10; 
      value += token[current]-'0'; 
     } 

     current++; 
    } 

    if (isNeg == 'F') return value; 
    if (isNeg == 'T') return -1 * (value + 1); 
} 

을, 당신은 오류 검사에 대한 -1 사용 , 일단 당신이 그것을 끝내면 반환 값을 음수로 증가시킵니다. 사용자가 -2^15을 입력했지만 -1보다 정확하게 입력 할 수없는 경우를 제외하고 어떤 작품이 맞습니까?

그러나 이것은 또한 성가신 일이며, 파란색에서 값을 무작위로 증가시키는 것은 혼란 스럽습니다. 그래서이^메소드를 고수해야합니까 아니면 동일한 작업을 수행 할 수있는 대안이 있습니까? 대안이 있다면,이 대안은 무엇입니까?

+0

isNeg를 문자 배열로 사용하는 대신 단순히 bool 또는 int가 아닌 이유는 무엇입니까? 또한 어떤 사람들은 루틴에 하나의 리턴 만 있어야한다고 생각합니다. – Jiminion

+0

이 코드는 while 루프에서 -1 또는 segfault를 반환하도록 바인딩됩니다. – msam

+0

@Jim isNeg는 일반적인 char 값입니다 ...? –

답변

2

빨강이 올바르게 표시되면 실제로 int를 반환해야하지만 오류를 감지 할 수 있어야합니다. 이 작업을 수행하는 일반적인 두 가지 방법이 있습니다. 참조로 전달 된 인수에 반환 값을 두거나 오류를 설정/가져 오기 위해 다른 메서드를 추가하는 것입니다.

첫 번째의 경우, ...

int myfcn(int* result, char[] input) { 
    // do stuff 
    ... 
    if(success) { 
     *result = ...; 
     return ERROR_SUCCESS; 
    } else { 
     return ERROR; 
    } 
} 

두 번째의 모습 같은 것

void caller() { 
    int value = TokenToInt(...); 
    if(getLastError() != ERROR_SUCCESS) { 
     // handle the error 
    } 
} 

int TokenToInt(...) { 
    // do stuff 
    if(error) { 
     setLastError(ERROR_WHATEVER); 
     return result 
    } 
    return result; 
} 

당신은 추가 세부 사항을 위해 GetLastError 함수를 찾아 볼 수 있습니다.