[C] 문자열
문자열은 지금까지 C언어를 배우면서 잠깐잠깐 봤지만 사실 알고보면 더 복잡한 녀석이더라고요.. 이번시간엔 그 문자열에 대해서 자세히 알아보도록 하겠습니다.
문자열의 길이(문자의 개수)를 반환
strlen(문자열포인터);
strlen(문자배열);
s1포인터에는 “Hello”를 가진 문자열의 주소를 저장하고, s2는 배열이죠? char타입의 길이 10인 배열을 선언하고 문자열을 할당했습니다. 저번에 말씀드린것처럼 문자열 끝에는 널문자가 있다고 하죠? 그럼 문자열의 길이를 알려주는 strlen을 사용하면 6이 나올까요?
잉 5가 나왔네요? 아마 널문자는 제외하고 읽나봅니다..
문자열 비교 결과를 반환
strcmp(문자열1, 문자열2);
it strcmp(char const *_Str1, char const *_Str2);
-1: ASCII 코드 기준으로 문자열2(s2)가 클 때
0: ASCII 코드 기준으로 두 문자열이 같을 때
1: ASCII 코드 기준으로 문자열1(s1)이 클 때
strcmp는 stringcompare, 말그대로 두 문자열의 비교를 위한 문장이라고 할 수 있죠. 문자 비교의 기준은 ASCII코드인데요. 예전에 a와 A를 숫자로 나타냈던 적이있었죠? 이때 각각 a와 A를 나타내는 고유값이 있었는데요 그것이 ASCII코드입니다. 그래서 두 문자열이 같으면 0, 코드숫자가 s2가 더 크면 -1, s1이 더 크면 1을 출력합니다.
s2에는 Helloo로 문자가 하나 더 붙어서 더 크겠죠?
-1이 출력되었고 작성한 if문대로 또 출력이 잘 되는것을 볼 수 있습니다.
문자열 복사
strcpy(대상문자열, 원본문자열);
char *strcpy(char *_Dest, char const *_Source);
대상문자열의 포인터를 반환합니다.
s1문자열에는 Hello를 넣고 s2에는 초기화는 하지 않고 선언만 했습니다. 이럴 경우 s2는 쓰레기값이 나오죠.
그래서 strcpy 전과 후를 나누어 s2를 출력했습니다.
전에 s2는 역시 이상한 값들만 나왔는데 후에는 s1에 있던 문자열이 s2로 복사가 되어서 Hello가 나오는 것을 확인할 수 있습니다.
**주의할 점은 *s1같이 포인터로 선언 되었을 경우 문자열 리터럴은 읽기 전용 데이터 영역(데이터 세그먼트)에 생성되어서 쓰기는 불가능 해집니다. 예를 들어,
char *s1 = “Hello”;
char *s2 = “”;
strcpy(s2,s1); 이 불가능하다는 것입니다.
문자열 붙이기 strcat() string concatenation
문자열 붙이기
strcat(최종문자열, 붙일문자열);
char *strcat(char *_Destination, char const *_Source);
최종 문자열의 포인터를 반환합니다
말그대로 문자열에 다른 문자열을 붙이는 작업입니다. 널문자는 문자열 끝에 한번만 필요하므로 이동할때에는 널문자없이 문자만 갑니다.
strcat(s2,s1); 은 s2뒤에 s1을 이어쓴다는 겁니다.
실행시키면 이런 식으로 world가 Hello뒤에 붙는군요.
문자열 안에서 ‘문자’로 검색
strchr(대상문자열, 검색할문자);
char *strchr(char * const _String, int const _Ch);
문자를 찾았으면 문자로 시작하는 문자열의 포인터를 반환, 문자가 없으면 NULL을 반환
포인터를 반환하기 때문에 그 찾은문자 이후로도 쭉 출력이 됩니다.
s1을 저렇게 작성하였습니다. 그리고 char타입의 포인터변수 ptr은 strchr(s1,’a’);를 대입시켰습니다. 따라서 s1 에 a가 등장하는 때의 주소를 가지고 있다는 겁니다. 그리고 if 조건에 ptr만 넣었습니다. 못찾으면 NULL(=0)값을 배출하기 때문에 0값이 아니면 참으로 본다고 했죠? 그리고 참일때 printf문에 있는 %d서식지정자에는 ptr-s1을 했습니다. 그래서 그 문자열 몇번째에서 찾았는지 보여줄 수 있죠.
이번에는 while문으로 만들었습니다. ptr값이 null이 나올때까지 반복하는 겁니다. 첫번째 printf문은 위랑 동일 하며, 그다음엔 ptr주소에 1을 더해서 그 이후로 또 ‘a’라는 문자를 검색하는 문장의 주소를 ptr에 대입시킵니다.
이렇게 a를 찾은 곳마다 몇번째인지, 그 이후로 문자열을 또 출력했습니다. 복잡한거 같지만 재밌네요 ^^
문자열 안에서 ‘문자열’로 검색
strstr(대상문자열, 검색할문자열);
char *strstr(char * const _String, char const * const _SubString);
문자열을 찾았으면 문자열로 시작하는 문자열의 포인터를 반환, 문자열이 없으면 NULL을 반환
저네는 문자열에서 문자를 검색했는데 이번에는 문자열을 검색합니다
strchr와 다르게 “문자열”을 검색한다는 것의 차이가 있습니다..
문자열 대소문자 변환
strupr(대상문자열) : 주어진 대상문자열을 전부 대문자로 변환
strlwr(대상문자열) : 주어진 대상문자열을 전부 소문자로 변환
원본문자열 변화됨 (주의!)
strupr,strlwr를 사용하여 어떻게 변화 되는지 알아봅시다.
잘 나왔네요. 신기한 것은 그 문장을 사용하고난 뒤에도 원본에 벼노하가 있음을 알 수있었습니다.
이번시간에는 문자열에 대해서 몇가지 알아보았습니다!
Comments powered by Disqus.