2011-09-08 2 views
1

미리 몇 줄을 모르고 읽었을 때 문자열을 인쇄해야합니다. 내가 처음 string.Can 누군가가 그에 대한 수정을 제안 입력 한 후C++에서 문자열 묶음을 읽는 방법은 무엇입니까?

#include<stdio.h> 
#include<stdlib.h> 
#include<iostream> 

using namespace std; 
int main(void) 
{ 
    char* str; 
    std::cout<<"\nEnter strings:"; 
    while(!feof(stdin)) 
    { 
     std::cin>>str; 
     std::cout<<"\nThe string you entered is"<<str; 
    } 
    return 0; 
} 

어떤 이유로 위의 코드는 segmentation fault를 말한다 : 그래서 내가 EOF indicator.Here로 while(!feof(stdin))을 사용하기로 결정하는 것은 내 코드입니다.

+1

이것은 c가 아니며 C++입니다. C 나 C++로 할 필요가 있습니까? 그 차이는 엄청납니다! –

+0

태그 편집을 위해 fredik에게 감사드립니다! – station

답변

2

을해야한다.

당신이 현재 가지고있는 것은 임의의 메모리 영역에 대한 스택상의 포인터입니다. 즉, 문자를 읽을 때 다른 데이터 나 쓰기를 할 수없는 메모리 전체에 걸쳐서 스톰프하게됩니다. 세그 폴트.

일부 메모리를 할당 할 때 문제는 문자열을 읽을 때까지 얼마만큼 할당해야할지 모르겠다는 것입니다. ("300 자"라고 말하면됩니다. 당신은 데이터 손상의 동일한 문제가 아니)

더 나은 C++ std::string 유형을 사용합니다.

1

strchar에 대한 포인터입니다. 거기에 글을 쓰려고 할 때 유효하지 않은 곳을 가리 키지는 않습니다.

C++에서 new의 일부 양식을 사용해보십시오. 또는 C++을 코딩하고 있으므로 더 나은 것은 std::string입니다.

1

str은 0x으로 선언됩니다. 이는 실제 문자열 (초기화되지 않은 BTW)이 아니며 아무 공간도 할당하지 않음을 의미합니다. 그것이 왜 안되는가. C++로 프로그램을 작성했기 때문에

std::string str; 

을 사용할 수 있습니다. #include <string>을 잊지 마세요.

0
#include<stdio.h> 
#include<stdlib.h> 
#include<iostream> 

using namespace std; 
int main(void) 
{ 
    std::string str[300]; 
    std::cout<<"\nEnter strings:"; 
    while(!std::cin.eof()) 
    { 
     std::cin>>str; 
     std::cout<<"\nThe string you entered is"<<str; 
    } 
    return 0; 
} 

트릭 당신이 들어갈 읽고있는 문자열에 대한 몇 가지 메모리를 할당 할 필요가

+0

한편 사람들은 버퍼 오버 플로우를 야기하는 나쁜 프로그래머와 싸우고 있습니다. 'getline' 함수를 추천합니다. – wormsparty

+0

@wormsparty가 말한 것과 while (! std :: cin.eof())는 스트림에서 모든 것을 읽는 올바른 방법이 아닙니다. –

+0

@wormsparty 예, 나는 누군가가 유비쿼터스'getline' 버전을 게시 할 때까지 기다리고 있었지만 아무도하지 않았고, 이상했다 ... –

1

응용 프로그램이 허용되지 않는 메모리 위치에 액세스하려고하면 세그먼트 오류가 발생합니다. char* str;

가능한 솔루션이 될 적당한 크기, 배열 포인터를 바꿀 것

가 이 같은

뭔가 충분할 수 :

귀하의 경우에는 문제가 아닌 초기화 된 포인터를 역 참조한다는 것이다
#include<stdio.h> 
#include<stdlib.h> 
#include<iostream> 

using namespace std; 
int main(void) 
{ 
    char str[20]; 
    cout<<"\nEnter strings:"; 
    while(!feof(stdin)) 
    { 
     cin.width(20); //set a limit 
     cin>>str; 
     cout<<"\nThe string you entered is"<<str; 
    } 
    return 0; 
} 
관련 문제