여기서 막혔다 token strtokㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
쪽8
참고로 id_list[i] (각각이) 는 const char* 이다.
프로그래밍 경험이 부족해서 그런가, const char* 에 대한 지식이 많이 부족한 것 같아 찾아 보니, const char 이 가리키는 문자열의 내용은 변경할 수 없다고 한다.
[이참에 char*, const char*, char* const, const char* const 차이점 알아보기!]
char* is a mutable pointer to a mutable character/string.
char*은 내용이 변할 수 있는 문자/문장에 대한 포인터 이고, 이 포인터 값(주소값)조차 변할 수 있다. 즉 완전히 다른걸 가리킬 수도 있단 것이다.
=> 흠 그런데 다시 찾아보니 포인터 자체는 stack 에있고, 포인터가 가리키는 문자열은 data영역에있어서 수정이 불가능하다고 한다ㅜ (그리고 이게 arr[]과 *p의 차이점이기도 하고!) 아 선언과 동시에 초기화를 할땐 data 영역에 있어서 수정이 불가한 거고, stack 영역의 문자열 상수를 가리키도록 할땐 수정이 가능한것 같다! 는 나의 궁예,, 틀리다면 채찍질해주세요,,,살살,,
const char* is a mutable pointer to an immutable character/string. You cannot change the contents of the location(s) this pointer points to. Also, compilers are required to give error messages when you try to do so. For the same reason, conversion from const char * to char* is deprecated.
const char*은 내용이 변할 수 없는 문자/ 문장에 대한 포인터이다. 문자들이 메모리 속에 뿌리박아 한발자국도 움직이려고 하지 않는다고 이해하면 편리한가,,? 하지만 이 포인터는 아예 다른 주소를 가리키는 것은 가능하다. 그래서 const char* 을 char*로 변환할수 없기도 하다.
char* const is an immutable pointer (it cannot point to any other location) but the contents of location at which it points are mutable.
char* const는 오직 한 주소만을!!가리킨다. 술마셔도 귀소본능에 의해 항상 집으로만 향한다고 생각하면 될라나? 그러나 그 문자의 내용은 바뀔 수 있다. 즉 내가 포인터라면, 나는 항상 같은 집만을 향하고 있지만, 집의 멤버들은 계속 바뀔 수 있다. 무서운 이야기군,,,
즉 const char* 과 char const*는 완전히 반대이다!
const char* const is an immutable pointer to an immutable character/string.
const char* const 는 오직 한 주소만을 가리키고, 그 주소의 문자/문자열 내용 또한 변하지 않는다.
<출처 - 갓택플로우 https://stackoverflow.com/questions/9834067/difference-between-char-and-const-char>
자 이제 const char*의 의미는 정확히 알았다. 그런데, 왜 strtok함수를 사용하면 에러가 날까?
내가 (수박 겉핥기 식으로)알기에 token 은 구분자 전까지의 내용을 가리켜준다고 했다. 내가 알기로 const char* 형인 id_list[i]를 변경하는 일은 없고, 그저 token이 그 주위를 어슬렁 거리고 있다고 알고 있었기 때문에, 무엇이 문제가 되는지 정확히 알지 못하였다. 그러던 중, strtok 함수의 정확한 동작원리를 알게 되었고, 의문이 풀렸다.
https://blockdmask.tistory.com/382 <= 이 분의 블로그를 참고하였다.
strtok 함수를 쓰게 되면 구분자 (여기선 공백 " ")가 '\0'으로 바뀌게 된다!!
생각해보니 그래야 문장이 끊겨서 token 을 호출해도 전체 문장이 아닌 구분자의 앞 어절을 가지고 올 수 있는 것이였다. \0가 곧 문장의 끝을 가리키게 되니,, 공백이 \0으로 바뀌지 않는다면 줄줄이 소세지마냥 어절로 끊기지 않고 구분자를 포함한 뒷문장들이 딸려올 것이다.
항상 느끼는건데 문제 상황의 해결은 생각보다 단순하다. ㅎ const char*의 내용중 공백 부분이 \0로 채워지게 되니 변경을 가하게 되어 문제가 생기는 것이다. 사실 문제에서도 힌트를 주고 있었다.
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
이렇게,,
내가 멍청해서 몰랐을 뿐이다.. 즉 여기서 해결책은 다른 메모리 공간에 id_list[i]의 내용을 복사하는 것이다. 이때, 수정이 가능한 공간에 id_list를 strcpy 해주시는 거시 key-point가 되시것다,, 그 대상을 char*로 했다가 또 봉변을 당했다.. 이유는 형광펜 참고 ㅎㅎ 결국 문자열에 하니 성공!! 눈물난다,, 코딩 3년찬데 이런것도 헷갈리다니,,, 아무리 코딩을 열심히 안했기로소니,,, 기초를 더 단단히 해야겠다 ㅎㅎ