[C++] String과 char 배열 비교

 입력을 받을 때 string과 char 차이!


1. input은 다음과 같다.

HELLO C++



2. 배열과 스트링 생성

1) char 배열 생성 

간단하게 동적 배열 생성하지 않아도 되도록, 가장 큰 배열 수만큼 SIZE를 define 해두자 

초기화는 memset이용하는데 여기서는 하지 않음


char arr[SIZE];



 2) 스트링 생성

string s;



3. 표준 입력 읽어오기

1)  char 배열 읽어오기

cin 

for문 돌려서 일일이 받아와도 되지만 배열 전체로 받아와도 됨

공백, 개행 무시


cin >> arr;


** 입력이 H E L L O C + + 이런 식으로 띄어쓰기 되어있다면 for문으로 일일이 받아와야 한다**


  2)  스트링 읽어오기

cin

#include <string> 필요

공백, 개행 무시


cin >> s;


4. 문자열 개수 

1) char 배열 크기

strlen(const char*)


int size = strlen(arr);


2) 스트링 크기

length()


int size = s.length();



5. 표준 출력 

1) char 배열 출력

역시 for문 돌려서 일일이 받아와도 되지만 배열 전체 출력가능


cout << arr;


혹은


for(int i = 0; i < strlen(arr); i++)

cout << arr[i];


2) 스트링 배열 출력


cout << s;


혹은


for(int i = 0; i < s.length(); i++)

cout << s[i];





<베열 예제1>


>> 소스 코드


#include <iostream>

using namespace std;

#define SIZE 10000


int main()

{

char arr[SIZE];

cin >> arr;


int size = strlen(arr);

cout << "크기 : " << size << endl;

cout << "내용 : " << arr << endl;


return 0;

}



>> 결과


크기 : 5

내용 : HELLO




<스트링 예제1>


>> 소스 코드


#include <iostream>

#include <string>

using namespace std;


int main()

{

string s;

cin >> s;        //     #include <string> 필요!


int size = s.length();

cout << "크기 : " << size << endl;

cout << "내용 : " << s << endl;

cout << "세번째 문자 : " << s[2] << endl;    // 문자 하나씩 접근 가능

return 0;

}



>> 결과


크기 : 5

내용 : HELLO

세번째 문자 : L







그렇지만 'Hello C++'을 다 받고 싶은걸?


위의 경우에는 모두 공백을 만나면 입력을 끝내기 때문에 HELLO 밖에 받을 수가 없었다

cin  말구 표준 입력 읽어오기를 다시 해보자.



3. 표준 입력 읽어오기에서 

1)  char 배열 읽어오기

cin.getline(_Elem *_Str, streamsize _Count, _Elem _Delim)

cin.getline(변수 주소, 최대 입력 가능 문자수, 종결 문자)


_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count)

{ // get up to _Count characters into NTCS, discard newline

return (getline(_Str, _Count, _Myios::widen('\n')));

}


변수 주소 : arr

최대 입력 가능 문자 수 : 문자 수를 알아야한다. 그 수를 종결로 처리하므로. 정해진 SIZE만큼 받아와도 문제는 없다. (대신 종결처리를 제대로 해줘야겠지?)

종결 문자 : 세번째 인자를 쓰지 않는다면 기본적으로는 개행을  종결 문자로 처리



cin.getline(arr, SIZE);    // 종결 default: '\n'



  2)  스트링 읽어오기

getline(basic_istream<_Elem, _Traits>& _Istr, basic_string<_Elem, _Traits, _Alloc>& _Str)


basic_istream<_Elem, _Traits>& getline(

basic_istream<_Elem, _Traits>& _Istr,

basic_string<_Elem, _Traits, _Alloc>& _Str)

{ // get characters into string, discard newline

return (getline(_STD move(_Istr), _Str, _Istr.widen('\n')));

}

// 위의 cin.getline과 비슷한 맥락, 그러나 최대 입력 가능 문자 수 입력하지 않아도 된다!


getline(cin, s);





<배열 예제2>


>> 소스 코드


#include <iostream>

using namespace std;

#define SIZE 10000



int main()

{

char arr[SIZE];

cin.getline(arr, 5);


int size = strlen(arr);

cout << "크기 : " << size << endl;

cout << "내용 : " << arr << endl;


return 0;

}



>> 결과


크기 : 4

내용 : HELL





여기서 중요한 것은 cin.getline(arr, 5)를 받았으면 arr의 5번째를 종결 문자로 처리하기 때문에, HELL까지 찍히는 것이다!


공백 처리가 되도록 20을 넣어보자

cin.getline(arr, 20);



<배열 예제3>


>> 소스 코드


#include <iostream>

using namespace std;

#define SIZE 10000



int main()

{

char arr[SIZE];

cin.getline(arr, 20);


int size = strlen(arr);

cout << "크기 : " << size << endl;

cout << "내용 : " << arr << endl;


return 0;

}



>> 결과


크기 : 9
내용 : HELLO C++



최대 20번째고, 
10번째에 '\n'가 있으니까. 최대 크기가 아닌 종결 문자에 의해 종료되었다.
cin.getline(arr, SIZE)로 받아도 같은 결과가 나온다.
문자 개수를 모른다면 크게 받아도 될 것 같다.



<배열 예제4>


>> 소스 코드


#include <iostream>

using namespace std;

#define SIZE 10000



int main()

{

char arr[SIZE];

cin.getline(arr, SIZE, ' ');


int size = strlen(arr);

cout << "크기 : " << size << endl;

cout << "내용 : " << arr << endl;


return 0;

}




>> 결과


크기 : 5

내용 : HELLO




cin.getline(arr, SIZE, ' '); 이와 같이
종결 문자를 개행이 아닌 공백으로 ' ' 처리한다면 공백에서 끊긴다!






<스트링 예제1>


>> 소스 코드



#include <iostream>

#include <string>

using namespace std;

#define SIZE 10000



int main()

{

string s;

getline(cin, s);


int size = s.length();

cout << "크기 : " << size << endl;

cout << "내용 : " << s << endl;


return 0;

}



>> 결과


크기 : 9
내용 : HELLO C++



문자 개수를 정하지 않아도 잘 받아온다. '\n'까지
기본 종결 문자인 '\n' 대신 공백으로 처리하면 getline(cin, s, ' ');




<스트링 예제2>


>> 소스 코드


#include <iostream>

#include <string>

using namespace std;

#define SIZE 10000



int main()

{

string s;

getline(cin, s, ' ');


int size = s.length();

cout << "크기 : " << size << endl;

cout << "내용 : " << s << endl;


return 0;

}



>> 결과


크기 : 5

내용 : HELLO

공백으로 잘 짤렸다!




스트링과 배열의 차이는
스트링을 사용하기 위해 라이브러리를 추가(<string>)해야한다는 것과, 이를 추가함으로써 다양한 함수들을 사용할 수 있다는 이점이 있다
는 것.




** 참고
입력 데이터가 다음과 같을 때,
HELLO C++
HAPPY DAY
입력을 모두 받고 싶을 때
cin.getline(arr, SIZE); 이렇게 받아버리면
HELLO C++로 찍힌다

그럴 땐!


>> 소스 코드

#include <iostream>

using namespace std;

#define SIZE 10000



int main()

{

char arr[SIZE];

cin.getline(arr, SIZE, NULL);


int size = strlen(arr);

cout << "크기 : " << size << endl;

cout << "내용 : " << arr << endl;


return 0;

}



>> 결


크기 : 19
내용 : HELLO C++
HAPPY DAY


공백으로 잘 짤렸다!







반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️