2011-10-31 10 views
6

저는 K & R 서적에서 C를 배우는 파이썬 프로그래머입니다. 이것은 매우 사소한 질문처럼 보일 것입니다,하지만 그럼에도 불구하고 나는 곤란합니다. atoi() 함수를 구현하는 K & R (RIP Ritchie!) 서적의 코드 스 니펫이 첨부되어 있습니다.atoi() 함수 이해하기

atoi(s) /*convert s to integer */ 
char s[]; 
{ 
    int i, n, sign; 
    for (i=0; s[i]==' '||s[i] == '\n' || s[i] == '\t'; i++) 
    ; /* skip whitespace */ 
    sign = 1; 
    if (s[i] == '+' || s[i] = '-') /* sign */ 
     sign = (s[i++] == '+') ? 1 : -1; 
    for (n=0; s[i] >= '0' && s[i] <= '9'; i++) 
     n = 10 * n + s[i] - '0'; 
    return (sign * n); 
} 

내 질문 :

1) 루프 '에 대한'최초의 유효 characaters의 수를 계산 이외의 어떤 목적을 제공합니까?
2) (1)이 참이면 첫 번째 루프는 'i'값을 유효한 문자 수로 설정합니다. 두 번째 for 루프는 재설정하지 않고 i를 0으로 어떻게 작동합니까?

예를 들어 함수의 입력으로 '2992'를 입력합니다. 첫 번째 for 루프는 i를 3으로 설정하므로 나머지 함수는 어떻게 작동합니까? 내 기초가 엉망이 될 수도 있지만 도움이 될 것입니다. 감사, -Creig

+1

나는 C가 _that_ terrible이라는 것을 알지 못했습니다. –

+0

코드 조각을 이해하는 가장 좋은 방법은 디버거 (예 : gdb)로 코드를 실행하고 단계별로 진행하는 것입니다. 또한 내부의 코드와 주석을 읽는 것이 도움이 될 수 있습니다. – eyalm

+0

@PatrickB .: 그게 아주 오래되었습니다. C. 현대 C는 ... 똑같은 것처럼 보입니다. (이제는 훨씬 더 명확한 int atoi (const char * s) 함수 서명을 제외하고). – Mat

답변

10
int atoi(char* str) 
{ 
    if(!str) 
     printf("Enter valid string"); 

    int number = 0; 
    char* p = str; 

    while((*p >= '0') && (*p <= '9')) 
    { 
     number = number * 10 + (*p - '0'); 
     p++; 
    } 
    return number; 
} 

여기 ATOI의 전체적인 아이디어가 있습니다.

1) 당신은 char 배열

2의 시작 포인터를 설정) 그리고 각 문자 가서 10을 곱과 0

에 의해 빼서 문자를 추가 루프 동안 내부 2992로 시도하면 2992가됩니다.

+0

OP가 K & R로 거슬러 올라간다면 C89에서 중간 코드에 선언을 넣을 수 없다는 것을 지적 할 것입니다. http://stackoverflow.com/questions/288441/variable-declaration-placement- in-c – HostileFork

4

첫 번째 루프는 주석이 말하는대로 공백을 건너 뜁니다.

그 다음에, i은 첫 번째 공백이 아닌 문자의 색인입니다. 정확히 진행해야합니다.

1

아니요, 첫 번째 루프는 공백을 건너 뜁니다 (주석에있는 것처럼).

1

의견은 대답을 제공합니다. 첫 번째 루프는 으로 공백을 건너 뛰고입니다. 2992의 경우 i0으로 유지됩니다.

1

첫 번째 for 루프는 첫 번째 비 공백 문자를 가리 키도록 진행합니다.

루프 사이의 조건에 따라 기호가 기록됩니다 (있는 경우).

그런 다음 최종 for 루프가 실제 변환을 수행합니다.

마지막으로 부호가 적용되고 결과가 반환됩니다.

0

1) 첫 번째 for 루프는 문자의 수를 계산하지 않지만 시작 문자 만 공백 인 경우 즉,이 "-2992"의 경우 1이되고 "2992"의 경우 나는 숫자의 첫 번째 위치를 계산합니다. 0 2) sign = (s[i++] == '+') ? 1 : -1;이 문장은 i 번째 char이 부호인지 확인하고 카운터를 1 [i ++] 증가시키고 다음 for 루프에 대해 i가 문자열의 첫 번째 시작 숫자임을 확인합니다. 첫 번째 조건부 입력을 위해 0을 만들면 체크 헌장은 공간이됩니다!

edit1 : 첫 번째 입력은 "공백 - 2992"