반응형

문자열의 길이를 반환하는 함수

 

인자로 전달되는 문자열의 길이를 반납하는 함수로 strlen()함수가 있습니다.

strlen 함수는 문자열의 길이를 반환해 줍니다.(이때 길이에 NULL은 포함되지 않습니다.) 

 

길이에 NULL이 포함되지 않는다는 것을 알아보기 위해 간단한 예제를 보겠습니다. 

 

 

8번째 줄에서 무한반복문을 이용하였습니다.

10번째줄에서 문자열을 입력받고

11번째 줄에서 그 문자열의 길이를 출력합니다.


 

출력결과입니다.

 

 

음? 문자열의 길이보다 1이 더 크게 나옵니다. 

앞서 strlen 함수가 길이를 구할때 NULL값은 뺀다고 했습니다. 

1이 더크게 나오는 이유는 우리가 프로그램에서 문자열을 입력하고, Enter를 누릅니다. 

저 문자열 길이가 1이 크게 나오는것은 Enter 때문입니다. 

즉 strlen 함수는 문자열을 '123456\n' 이라고 인식하는 것입니다. 

 

 

 

문자열을 복사하는 함수 

 

이번엔 문자열을 복사하는 함수입니다. 

 

strcpy 함수는 앞서 다루었던 gets 함수처럼,

 

잠재적으로 overflow를 일으킬 문제가 있기 때문에

 

strncpy 함수를 사용합니다.

 

사용 예를 살펴보겠습니다.

 

 

 

11번째줄을 잘 보면 원래 문자열인 "World of Tank is best game"에서

2번째 배열(크기가 15인 str2)에 크기만큼(15만큼) 복사합니다.

그런데 NULL문자를 넣을 공간이 있어야 하므로 크기-1 만큼 복사한 뒤

제일 마지막에 NULL문자를 넣어줍니다.

 

실행결과입니다.

 

복사하는 배열의 크기가 15이므로 

그 크기에 맞게까지 데이터가 복사되었습니다. 

만약 strcpy 함수를 이용하여 구현했으면, overflow를 일으킬 것입니다. 

 

문자열을 추가하는 함수 

 

기존에 존재하는 문자열의 뒤에 다른 문자열을 덧붙이는 함수입니다. 

 

strcat 함수는 strcpy 함수와 마찬가지로 잠재적으로 overflow 발생 가능성이 있으므로 

strncat 함수를 사용합니다. 

 

사용예제입니다. 

 


코드를 잘 살펴 보시면

6번째 줄에서 크기 30인 배열을 선언하고 안에다가 문자열을 넣었습니다.

문자열은 NULL문자 포함하여 23글자이며, 즉 str1 배열에는 7칸의 공백이 남습니다.

 

그런데 7번째 줄을 보면 크기 15인 배열 str2를 선언하여 10번째줄에서 입력을 받습니다.

즉 나중에 str2 배열의 내용을 str1 배열에 복사할 때, str1 배열의 공백인 7칸보다

더 큰 배열이 복사될 수도 있다는 것입니다.

 

그래서 12번째줄에서 strncat 함수를 사용하여, 3번째 인자로 7을 전달함으로써

str1 배열의 7칸 공백만큼만 복사를 하고 있습니다.

만약 12번째 줄에서 strcat 함수를 썻다면.. 이런 결과가 나올것입니다.

 

 

 

오버플로우가 발생했기 때문이죠..

 

위에 출력결과는 정상적으로 출력되었는데.. 저 흘러넘친 메모리 다음 공간에 별 내용이

 

없어서 정상적으로 출력이 되었는데,

 

메모리 다음공간(str1배열 30칸 그다음 메모리)에 어떤 내용이 있다면.. 치명적인 오류가

 

발생합니다.

 

 

정상적인 출력결과입니다.

 



 

메모리 공간보다 많은 입력이 들어오면,

앞서 지정해놓은 만큼만 입력을 받고, 나머지는 버려버립니다.

이렇게 프로그래밍을 한다면 오버플로우가 발생할 위험은 없지요.

 

이상입니다. 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기