는 ++

2012-08-10 3 views
2

은 내가 문자열 연결 질문 SE의 죽음을 요구하고있다 알고있다. 그러나 내가 아는 한 최선을 다해 나를 도울 수있는 모든 질문을 헛되이 지나쳤습니다.는 ++

이 내가이 프로그램을 수행 바라고 무엇을 :

가 처음에 나는 = 0, B = 1, 대한 N = 0 N = 1을 각각 가지고있다. N = 3에서 다음 입력 용 즉

는 전방 내 결과 이전의 두 스트링 연결되어야한다. (피보나치 시퀀스 등; 만 첨가 연결에 의해 대체된다) 예 따라서

:
N = 3, 제 출력은 "10"이 될 것이다. N = 4
, 내 출력은 "101"N 들어
은 = 5, 내 출력이 "10110"이

내가 작성한 코드와 논리적 문제가 없습니다해야해야하지만, 나는군요 SIGSEGV 오류와 나는 왜 보이지 않습니다. 내가 잘못 뭐하는 거지

#include <iostream> 
#include<new> 
#include<string.h> 

using namespace std; 

int main() 
{ 
    long int n,i; 
    char *a="0"; 
    char *b="1"; 
    char *c=new char[100000]; 

cout<<"Enter a number n:"; 
cin>>n; 

for(i=0;i<n;i++) 
{ 

    strcat(b,a); 
    strcpy(a,b); 

} 
cout<<"\nRequired string="<<b; 

}

?

+0

난 당신이 내가 'C'를 사용하려는 않았다 C :) –

+0

를 사용하는 것을 잊었다 생각하지만, 나는 그냥 내가 거라고 잊었 :)와 함께 작동하도록 불필요한 변수 것을 발견 그것을 선언했다. – wave5459

답변

6

strcat(b,a); 때문에 b 점 리터럴 문자열로 정의되지 않은 동작을 호출합니다.

char * strcat (char * destination, const char * source); 

연결할 문자열 는 destination 문자열로 source 문자열의 복사본을 추가합니다. 이 C++이기 때문에

, 나는 당신이 std::string+ 연산자를 사용하는 것이 좋습니다. 또는 std::stringstream 당신이 관찰된다

+0

네, 이제 이해합니다 :) 그리고 임무 완수 : D 감사합니다. – wave5459

+0

+1'std :: string' /'std :: stringstream'을 제안 했으므로 결코 충분한 시간을 말할 수는 없습니다. –

3

문제는 정의되지 않은 동작과 관련이있다 : 당신이 리터럴 문자열에 할당 된 메모리에 기록된다.

이 문제를 방지하려면 C++ std::string으로 전환해야합니다. 그림에서 메모리 관리를 통해 코드를 훨씬 간단하게 만들 수 있습니다.

string a("0"); 
string b("1"); 
int n = 10; 
for(int i=0;i<n;i++) { 
    string tmp(a); 
    a = b; 
    b = tmp + b; 
} 
cout<<"Required string="<<b; 
+0

[링크] (http://ideone.com/upb4X)를이 코드에 적용하십시오. – dasblinkenlight

1
char *a="0"; 
char *b="1"; 

"0"과 "1"이 string-literals이다 (a 중 주소가 "0"및 B "1"의 주소를 가짐)가 포함되어 그 변화는 undefined behaviour이다.

strcat(b,a); 
strcpy(a,b); 

UB.

당신이 C++보다 효율적으로 사용을 사용하기 때문에 std::string 또는 std::stringstream.

0

당신은

char *a="0"; 
char *b="1"; 

이 상수 문자열에 대한 포인터로 ab을 선언했다. 이는이 포인터에 할당 된 메모리가 고정되어 있음을 의미합니다. 이 메모리 블록을 작성하면 Bad Things (TM)가 발생합니다.

0

strcat을 사용하고 있지만 대상 문자열은 문자열 리터럴입니다. strcat 그러면 null 문자를 종료하는 그 문자열을 쓰려고 시도하는 것입니다. 그리고 seg 오류가 오는 곳입니다. 문자열 리터럴을 전혀 수정하지 마십시오. 이 연습을하지 않으면 C++를 사치스럽게 사용하기 때문에 std :: string을 사용하는 것이 훨씬 낫습니다.

대신, 나는 당신이 N의 inital 값으로 생각할 필요가 있음을 보여주는하고이 코드를 사용할 수 있습니다
0

= 1, 2 또한 당신은 N < 0 로 잘못 입력을 처리하고 당신이 보인다 동적 할당을 피해야한다 명백한 이유없이 새로운 것을 사용하고 마지막에 삭제로 메모리를 비우는 것을 잊었습니다.

#include <iostream> 
#include<new> 
#include<string.h> 

using namespace std; 

int main() 
{ 
    long int n,i; 
    char a[10]; 
    char b[10]; 
    char c[10]; 
    //char *c=new char[100000]; 
    cout<<"Enter a number n:"; 
    cin>>n; 

    strcpy(a, "0"); 
    strcpy(b, "1"); 

    if (n == 1) 
     strcpy(b, a); 
    else if (n > 2) 
    { 
     for(i=2;i<n;i++) 
     { 
      strcpy(c, a); 
      strcat(c, b); 
      strcpy(a, b); 
      strcpy(b,c); 
     } 
    } 
    else if (n != 2) 
     cout<<"\nInvalid input!"; 

    cout<<"\nRequired string="<<b; 

}

+0

처음에는이 방법을 시도했지만 간단하지만 n 값이 커지면 큰 문자열에는 적용되지 않습니다. – wave5459

+0

예 작은 n 만 사용할 수 있습니다. –