[C++] char[] to string, string to char[] / char[], char* 의 차이점
이젠 머릿속에 넣읍시다

에잇
char[] to string
생성자 사용
char str_char[10] = "lemonade";
string str(str_char);
또는
string str="";
str=str_char;
해주면 대입연산자가 알아서 str_char의 주소값부터 시작해 '\0'까지 읽어들여 string으로 만들어 주는 형식인가보다
string to char[]
string str="lemonade";
char str_char[10] ;
strcpy(str_char, str.c_str());
string에 .c_str()만 해주고 나서 바로 할당해줄 수 없나? 하겠지만 그러면 const char* 로 받아야 한다 (수정 불가능) (으악)
const char* str_char = str.c_str();
그래서 char[]를 먼저 생성해준 후 strcpy하는 방법을 선택한다~

연습문제로 좋은문제 - 백준 1181번 단어정렬
https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
참고
https://ddingji.tistory.com/106
[C++] 1181: 단어 정렬
solved.ac에서 class3 필수문제들 다시 풀어보자! 하다가 발견한 문제인데 C++을 쓰면서 scanf/printf를 사용하는 나같은 사람에게는 조금 까다로울 수 있는 문제라서 다시 풀어봤다 이 문제를 푸는 방법
ddingji.tistory.com
char[] <-> char* 차이점
char[]: char(1바이트) 형의 배열
- 배열의 원소에 접근 및 수정 가능
char *: 문자열 포인터 변수.
- 주소값을 이용해서는 접근 가능하지만 (printf(%s, str + 2) -> 포인터변수가 가리키는 주소에서부터 2바이트 떨어진 곳에서 시작해서 '\0'가 있는 곳까지 읽음)
- 쓰기가 불가능하다
- =============> 왜냐?! 이유: https://ddingji.tistory.com/94
메모리 영역 - 고정/가변 영역
DATA영역 .rodata: READ ONLY 이며 초기화 됨(고정) ex) const => 선언과 동시에 초기화를 해줘야 하며 READ ONLY로 값은 바꿀 수 없음 const ptr* = "abced" 라면 "abcde"가 .rodata영역에 있는거임! ptr은 위치한 곳에
ddingji.tistory.com
- (.rodata 영역에 할당되니까 READ ONLY 이다)
- char[]과 같이 접근이 불가능하다 (printf(%s, str[2]))
- -> 어쩌구[] 와 같은 접근은 어쩌구가 어떤 자료형으로 선언되어있는지를 읽어온 후에 해당 자료형의 바이트만큼 점프해주는거기 때문에 포인터 변수는 해당안됨
- 문자열의 크기를 명시해서 선언해줄 필요 없으니 편리하고 메모리적으로도 굳
- char[]도 char str[] = "abc"같이 되긴 하지만 char str[]; str="abc"는 안되므로..