문자열을 덧붙이는 함수들: strcat, strncat
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[20] = "First~";
char str2[20] = "Second";
char str3[20] = "Simple num: ";
char str4[20] = "1234567890";
//case1
strcat(str1, str2);
puts(str1);
//case
strncat(str3, str4, 7);
puts(str3);
return 0;
}
strcat 함수 호출 시 str2의 문자열이 str1의 문자열 뒤에 덧붙여지는데, 덧붙임이 시작되는 위치는 str1의 널문자 다음이 아니라 널문자가 저장된 위치에서부터 이다. 이렇게 널문자가 저장된 위치에서부터 복사가 진행이 돼야, 덧붙임 이후에도 문자열의 끝에 하나의 널문자만 존재하는 정상적인 문자열이 된다.
strncat(str3, str4, 7); str3의 뒤에 문자열을 덧붙이는데, 7개의 문자만 덧붙인다. 이 7개의 문자에는 널문자가 포함이 되지 않으므로, 널문자를 포함해서는 총 8개의 문자가 덧붙여진다.
strncat 함수는 strncpy 함수와 달리 문자열의 끝에 널 문자를 자동으로 삽입해준다.
문자열 비교의 잘못된 예제
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[] = "my string";
char str2[] = "my string";
if (str1 == str2)
puts("equal");
else
puts("not equal");
return 0;
}
문자열 str1과 str2를 비교하여 equal의 출력을 예상하였다면, 잘못된 생각이다.
그 이유는 배열의 이름은 배열의 주솟값인데, 이 주솟값을 가지고 비교를 하고 있기 때문이다. 그러므로 출력 값은 not equal이 출력이 된다. 두 문자열의 주솟값이 다르기 때문이다.
문자열을 비교하는 함수들: strcmp, strncmp
#include<stdio.h>
int strcmp(const char * s1, const char * s2);
int strncmp(const char * s1, const char * s2,size_t n);
s1이 사전 편찬 순서상 뒤에 위치하면 0보다 큰 값 반환.(s1이 더 크면)
s2가 사전 편찬 순서상 뒤에 위치하면 0보다 작은 값 반환.(s2가 더 크면)
s1과 s2의 내용이 모두 같으면 0 반환.
<예제>
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[20];
char str2[20];
printf("문자열 입력 1 : ");
scanf("%s", str1);
printf("문자열 입력 2 : ");
scanf("%s", str2);
if (!strcmp(str1, str2))
{
puts("두 문자열은 완벽히 동일하다.");
}
else
{
puts("두 문자열은 동일하지 않습니다.");
if (!strncmp(str1, str2, 3))
puts("그러나 앞 세글자는 동일합니다.");
}
return 0;
}
if (! strcmp(str1, str2) )의 문장에서 str1과 str2가 동일하면 0을 반환하는데, 이 0은 거짓을 의미한다. 그러므로 strcmp 함수 앞에!(낫) 연산을 함으로써 거짓을 참으로 바꿔준다. 즉 str1과 str2의 문자열이 완벽히 동일할 때 참이 되어 if문이 출력이 된다.
그 이외의 변환 함수들
이 함수는 <stdlib.h> 헤더파일에 선언된 함수들이다.
int atoi(const char * str); //문자열의 내용을 int형으로 변환
long atol(const char * str); //문자열의 내용을 long형으로 변환
double atof(const char * str); //문자열의 내용을 double형으로 변환
<예제>
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char str[20];
printf("정수 입력: ");
scanf("%s", str);
printf("%d\n", atoi(str));
printf("실수 입력: ");
scanf("%s", str);
printf("%g\n", atof(str));
return 0;
}