본문 바로가기
개발 공부/C언어

[실험] #19 C언어 strncpy, strncat와 \0, \n 대체 어디부터 어디까지 복사하는거야!

by 반달bear 2022. 8. 7.
반응형

strncpy와 strncat을 단독으로 사용할때도 뭐가 뭔지 모르게 복사되는데 

문자열을 선언하고 복사하는 것이 아니라 입력함수로 입력받고 출력할 때도 아 이거 뭐가 어떻게 돌아가는지 모르겠다 싶으시죠?

그건 \0와 \n에 대한 개념이 제대로 정립되어있지 않아서 그렇습니다.

scant, gets, fgets와 \0, \n에 대한 개념은 아래 링크를 참조해주세요!

[실험] #20 C언어 fgets gets scanf의 차이를 확실하게 알아보자 \0\n의 차이점도 같이 알아보자 (tistory.com)

 

 


 

strncpy()함수와 strncat()함수.

strncpy()함수는 단순하게 딱 말한 만큼만 복사합니다. 그러므로 범위 안에 \0을 포함하지 않고 있다면 직접 \0를 넣어줘야 합니다. 

 

 

good이라는 문자열이 있고 이를 strncpy를 통해 3문자만 복사하겠다고 가정해보겠습니다. 일반적으로 입력함수를 통해 해당 문자열을 입력받는다면 g,o,o를 입력받고 자동으로 뒤에 \0를 붙입니다. 

그러나 strncpy는 특이한 점이 g,o,o 까지 딱 여기까지 복사하고 \0를 붙여주지 않아요.

여기서 문제가 생깁니다. 왜냐하면 모든 출력함수들은 \0을 기준으로 문자열을 인식하기 때문입니다. 그래서 strncpy()를 사용하고 \0를 넣어주지 않으면 어디까지 읽어야 할지 몰라서 이상한 값이 출력됩니다. strncpy 함수를 쓸 때는 \0!!!를 꼭 기억합시다.

 

 

반면 strncat()함수는 자기가 마음대로!!!! \0를 조작합니다.

str1에 good\0이 있고 str2에 nicetomeetyou\0라는 문자열이 있다고 가정했을 때 strncat(str1, str2, 5)을 하면 good까지를 기준으로, 즉 \0를 빼고 good바로 뒤에 nicet를 넣어줍니다. 그리고 자기 마음대로 \0를 붙여버립니다.

애초에 \0를 고려해서 사이즈를 -1 줄여버리는 fgets()함수와는 딴판이죠.  모든 함수는 \0가 기준이다!!! 기억합시다!

직접 보여드리겠습니다.

 

 

보다시피 배열의 크기가 \0을 포함하지 못하면 에러가 뜹니다

str3에 str4를 7개만큼 복사해서 붙여넣으라는 의미의 코드이고 이때 아니 str4배열의 크기가 20이고 7만큼이나 복사했으니까 당연히 안들어가는거 아니냐! 하실 수 있겠지만 \0를 기준으로 읽기에 배열의 크기와는 관계 없습니다. 1234\0까지 읽는다고 생각하시면 돼요.

g,o,o,d,\0뒤에 \0을 빼고 g,o,o,d,1,2,3,4가 들어가준 후 \0를 붙여줘야 완성인데 들어가기만 하고 \0를 붙일 수 없으니 완성되질 못해서 에러가 뜬 것입니다.

아래 코드를 보면 더욱 상세하게 알 수 있습니다.

 

출력이 잘됩니다!!

널이 들어갈 수 있는 크기의 배열을 만들어주니 정상적으로 값이 출력되었네요.

 

반응형

댓글