2012-03-05 3 views
2

나는 다른 수치 시스템 페이지N 진수 SK 변환하지만, 때로는 충돌하고 내가 오류 코드가 0xc0000005가 (프로그램이 여전히 변환 모든 숫자를 출력) 프로그램을 만든 . 내가 변환 된 숫자가 6 개 기호보다 길다는 것을 알아 차렸을 때 (또는 단지 우연 일 때).C++ 무작위가 0xc0000005 오류

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    long n,sk,p,j; 
    string liekanos; 
    ifstream f("u1.txt"); 
    f >> n; 
    for (int i=0;i<n;i++) 
    { 
     f >> sk >> p; 
     j=0; 
     while (sk>0) 
     { 
      liekanos[j]=sk % p; 
      sk/=p; 
      j++; 
     } 
     for (j>=0;j--;) 
     { 
      if (liekanos[j]<10) 
       cout<<int(liekanos[j]); 
      else cout<<char(liekanos[j]+55); 
     } 
     cout<<endl; 
    } 
    return 0; 
} 

예 입력 : 당신의 liekanos 문자열 크기 나 용량이 결코 때문에

3 
976421618 7 
15835 24 
2147483647 2 
+0

을 그냥 알다시피,'0xC0000005' 액세스 위반 (잘못된 포인터) 오류입니다. 이것은 일반적으로 프로그램에서 포인터 처리 또는 메모리 할당에 결함이 있음을 의미합니다. – japreiss

답변

3

하려고하지만,이 문자열의 크기를 지정하지 않았기 때문에, 당신이 가장 가능성이 존재하지 않는 요소에 액세스하려고합니다. while 루프를 입력하기 전에 liekanos.resize(sk)으로 전화하여 결코 일어나지 않도록 할 수 있습니다.

아니면 liekanos의 가능한 최대 크기를 알고있는 경우 N은 크기와 c는 각 문자의 기본 값이다, 당신은 string liekanos(N, c);로 선언 할 수있다.

+0

'std :: string'도 크기가 조정되었습니다. 왜 그냥'std :: string'으로 유지하지 않는가? – Marlon

+0

@Marlon : 요점은, 그것은'string'으로 선언되었지만 결코 하나로서 사용되지는 않는다는 것입니다. – LihO

+0

@ Marlon : 나는 나의 대답을 편집했다. – LihO

1

당신은 정의되지 않은 동작을 얻고있다.

1
string liekanos; 

기본적으로 문자열의 크기는 0입니다. 하지만 인덱스 jliekanos[j] 액세스 권한 요소와

liekanos[j]=sk % p; 
-1

string liekanos; 대신에 std::vector<char> liekanos;을 사용하는 것이 더 좋습니다. 당신은 당신의 코드에서 일부 수정을 수행해야합니다 :

for (int i=0; i<n; i++) 
{ 
    std::vector<char> liekanos; 
    f >> sk >> p; 
    while (sk>0) 
    { 
     liekanos.push_back(sk % p); 
     sk/=p; 
    } 
    for (long j = liekanos.size(); j>=0; --j) 
    { 
     if (liekanos[j]<10) 
      cout<<int(liekanos[j]); 
     else cout<<char(liekanos[j]+'a'); 
    } 
    cout<<endl; 
} 
+0

어떤 이유로 벡터가 더 좋을까요? –

+0

@ Zyx2000 우리가 한 번에 한 문자를 처리하고 문자 집합을 얻는 것처럼'std :: vector '이'std :: string'보다 직관적이라고 생각합니다. 성능 측면에서 보면 두 솔루션이 동일 할 것이라고 생각합니다. 두 개의 표현을 연결하는 것과 같은 몇 가지 연산을 수행해야한다면'std :: string'이 더 좋습니다. –

관련 문제