공중과열새싹
Biomechanical engineering blog
전체 글 (34)
문자열
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