2013-08-02 1 views
0

안녕하세요. 여기에 내 첫 번째 질문입니다. 게시에 대한 모든 규칙을 따르지 않았다면 사과드립니다. 이것은 K & R exercise 2-3입니다. GCC로 컴파일 할 때 세그먼트 화 오류가 발생하며 디버거에 익숙하지 않아서 무슨 일이 벌어지고 있는지 이해할 수 없습니다. 누군가 코드를 훑어보고 무엇이 잘못되었는지 도와 주시면 감사하겠습니다.K & R 2-3 htoi 세분화 오류

#include <stdio.h> 

#define HEX 16 

unsigned int htoi(char s[]) { 
    int i, len, n, rp, v; 
    v = 0; 

    if (s[0] == '0') 
     if (s[1] == 'x' || s[1] == 'X') 
      s[1] = '0'; 
    for (len = 0; len != '\0'; ++len) { 
    } 
    for (i = len; i >= 0; --i) { 
     if (s[i] >= '0' && s[i] <= '9') 
      n = s[i] - '0'; 
     else if (s[i] >= 'A' && s[i] <= 'F') 
      n = s[i] - 'A' + 10; 
     else if (s[i] >= 'a' && s[i] <= 'f') 
      n = s[i] - 'a' + 10; 

     rp = len - i; 
     v += n * HEX^rp; 
    } 
    return v; 
} 

int main() { 
    int test = htoi("0x1a9f"); 
    printf("%d\n", test); 
    return 0; 
} 
+0

운동 질문이 포함되어 있어야합니다. 연습 문제 2-3. 16 진수 문자열 (옵션 0x 또는 0X 포함)을 등가 정수 값으로 변환하는 함수 htoi (s)를 작성하십시오. 허용되는 자릿수는 0-9, a- f, A- F입니다. – Ethan

답변

1
int test = htoi("0x1a9f"); 

htoi-"0x1a9f" 리터럴 스트링을 전달 (@Grijesh 차우 @simonc 및 통지). 이것은 읽기 전용 메모리에있을 수 있으며 수정할 수 없습니다. 그러므로 당신은 당신이 선 가장 쉬운 수정은 수정 가능한 변수

char s[] = "0x1a9f"; 
int test = htoi(s); 
로 원래 문자열을 복사하는 것입니다

s[1] = '0'; 

의 문자열로 작성하려고 (충돌이 유효한 예제) 정의되지 않은 동작을 얻을 htoi에 추가, Grijesh에 의해 보도 된 바와 같이

은 또한

for (i = len; i >= 0; --i) 

이 있어야 할 문자열의 경계를 넘어 읽어

for (i = len - 1; i >= 0; --i) 
+0

또한 색인이 틀렸다, 내 삭제 대답을 확인하십시오. –

+1

좋은 점은, 나는 그 코드를 훨씬 벗어났다. +1 (또는 삭제하지 않았다면) : – simonc

+2

내 대답을 삭제 했으므로 대기 중임을 제외하고 :) 감사합니다! 그 점을 더하기를 바랍니다. –

3

읽기 전용 인 문자열 리터럴의 주소를 전달하고 있습니다. 다음 작업을 수행하면 세그먼테이션 오류가 제거됩니다. 또한

char temp[] = "0x1a9f"; 
int test = htoi(temp); 

:

v += n * HEX^rp; 

^인가는 XOR 연산자 아닌 파워 연산자이다. len의 값이 배열 바인드를 벗어나 있기 때문에

for (i = len; i >= 0; --i)for (i = len - 1; i >= 0; --i)해야한다 : 전원 위해 당신은 또한 math.h

pow 기능이 필요합니다.

+1

감사! 나는 그것을 향해 일하고 있었다 : – phoxis