블로그

[C++] char[] to string, string to char[] / char[], char* 의 차이점 본문

CS

[C++] char[] to string, string to char[] / char[], char* 의 차이점

왕방토 2022. 12. 27. 22:55
728x90

이젠 머릿속에 넣읍시다

에잇

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'가 있는 곳까지 읽음)
  • 쓰기가 불가능하다
 

메모리 영역 - 고정/가변 영역

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"는 안되므로..
Comments