2021. 5. 30. 21:48, 어플리케이션/자료구조
728x90
선형 검색으로 문자열 길이 구하기.
#include <stdio.h>
int str_len(const char *s)
{
int len = 0;
// 만약에 해당 배열에 문자가 있으면 len값 증가. 널문자 나올 때까지 반복.
// 아래의 while문은 while(*s++)로 하여 sentinel method로 꾸며도 결과 동일함.
while (s[len])
len++;
// 리턴 값은 널 문자까지의 요소값이다.
return len;
}
int main(void)
{
char str[256];
printf("문자열 : ");
scanf("%s", str);
printf("이 문자열의 길이는 %d입니다.\n", str_len(str));
return 0;
}
임시로 배열 시작 요소를 저장해두고 증가시킨 s값에서 미리 저장해둔 배열 시작요소를 빼버려도 된다.
int str_len(const char *s)
{
// 임시적으로 s배열을 p배열로 재정의.
const char *p = s;
while (*s)
s++;
// s - (p + 0) 값 리턴.
return s - p;
}
문자열에서 문자 검색하기. strchr
#include <stdio.h>
//문자열에서 문자가 어느 요소에 있는지 반환하는 함수
int str_chr(const char *s, int c)
{
int i = 0;
c = (char)c; // 캐스팅
while (s[i] != c)
{
// null문자까지 도달 시 검색 실패임.
if (s[i] == '\0')
return -1;
i++;
}
return i;
}
int main(void)
{
char str[64];
char tmp[64];
int ch;
int idx;
printf("문자열 : ");
scanf("%s", str); // 이 자체가 주소값임.
printf("검색할 문자 : ");
scanf("%s", tmp);
ch = tmp[0];
if ((idx = str_chr(str, ch)) == -1)
printf("문자 '%c'(은)는 문자열에 없습니다.\n", ch);
else
printf("문자 '%c'(은)는 %d번째에 있습니다. ", ch, idx + 1);
return 0;
}
사실 이 str_chr 함수는
char *strchr(const char *s, int c); 형태로 string.h 헤더에 이미 정의되어 있는 함수이다.
때문에 반환값이 찾은 문자에 대한 char* 인 것에 주목해야 한다.
문자가 없으면 NULL값을 반환한다.
strchr 함수와 똑같이 작동하도록 수정해주면 다음과 같다.
#include <stdio.h>
//문자열에서 문자가 어느 요소에 있는지 반환하는 함수
char *str_chr(const char *s, int c)
{
c = (char)c; // 캐스팅
while (*s != c)
{
// null문자까지 도달 시 검색 실패임.
if (*s == '\0')
return NULL;
s++;
}
return (char *)s;
}
int main(void)
{
char str[64];
char tmp[64];
char ch;
char *idx;
printf("문자열 : ");
scanf("%s", str); // 이 자체가 주소값임.
printf("검색할 문자 : ");
scanf("%s", tmp);
ch = (char)tmp[0];
if ((idx = str_chr(str, ch)) == NULL)
printf("문자 '%c'(은)는 문자열에 없습니다.\n", ch);
else
printf("문자 '%c'(은)는 %d번째에 있습니다. ", ch, (idx - str) + 1);
return 0;
}
문자열 비교. strcmp
strcmp 함수와 동일하게 작동하는 함수 만들기.
#include <stdio.h>
int str_cmp(const char *s1, const char *s2)
{
while (*s1 == *s2)
{
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
return (unsigned char)*s1 - (unsigned char)*s2;
}
int main(void)
{
char st[128];
puts("Compare with \"ABCD\.");
puts("End when \"XXXX\"");
while (1)
{
printf("string st : ");
scanf("%s", st);
if (str_cmp("XXXX", st) == 0)
break;
printf("str_cmp(\"ABCD\", st) = %d\n", str_cmp("ABCD", st));
}
return 0;
}
이 함수도 마찬가지로 이미 정의되어 있는 함수이다.
단지 실제 strncmp 함수는 3번째 인수로 지정한 문자열의 길이만큼만 비교할 수 있다.
#include <stdio.h>
#include <string.h>
int str_ncmp(const char *s1, const char *s2, size_t n)
{
while (n && *s1 && *s2) {
if (*s1 != *s2)
return (unsigned char)*s1 - (unsigned char)*s2;
s1++;
s2++;
n--;
}
if (!n) return 0;
if (*s1) return 1;
return -1;
}
int main(void)
{
char st[128];
puts("\"STRING\"의 처음 세 문자와 비교합니다.");
puts("\"XXXX\"이면 종료합니다.");
while (1) {
printf("문자열:");
scanf("%s", st);
if (str_ncmp("XXXX", st, 3) == 0)
break;
printf("str_ncmp(\"STRING\", st, 3) = %d\n", str_ncmp("STRING", st, 3));
}
return 0;
}
728x90
'어플리케이션 > 자료구조' 카테고리의 다른 글
정렬 - Bubble sort (1) | 2021.05.24 |
---|---|
8-Queen recursion in c (0) | 2021.05.23 |
Queue in c (0) | 2021.05.21 |
Stack in c (0) | 2021.05.20 |
Comments, Trackbacks