IT공부

[C] 문자열 함수

shine94 2025. 2. 1. 06:12

* strlen 문자열 길이 계산

size_t strlen(
   const char *str
);

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strlen-wcslen-mbslen-mbslen-l-mbstrlen-mbstrlen-l?view=msvc-170

 

strlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l

자세한 정보: strlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l

learn.microsoft.com

 

str

 : 대상 문자열

 

#include <stdio.h>

size_t strlen(const char* str)
{
	int strLen = 0;
	while (str[strLen] != 0)
	{
		strLen++;
	}

	return strLen;
}

int main(void)
{

	const char* str1 = "nice to meet you";
	const char* str2 = "nice";
	char text[] = "hi nice";

	printf("%d\n", strlen(str1));
	printf("%d\n", strlen(str2));
	printf("%d\n", strlen(""));
	printf("%d\n", strlen(text));

	return 0;
}

 


 

* strcpy 문자열 복사

char *strcpy(
   char *strDestination,
   const char *strSource
);

 

strDestination

 : 대상 문자열

strSource

 : 복사할 문자열

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strcpy-wcscpy-mbscpy?view=msvc-170

 

strcpy, wcscpy, _mbscpy

자세한 정보: strcpy, wcscpy, _mbscpy

learn.microsoft.com

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strcpy-s-wcscpy-s-mbscpy-s?view=msvc-170

 

strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l

자세한 정보: strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l

learn.microsoft.com

 

#include <stdio.h>

char* strcpy(char* dest, char* src)
{
	int idx = 0;
	while (src[idx] != 0)
	{
		dest[idx] = src[idx];
		idx++;
	}

	dest[idx] = 0;

	return dest;
}

errno_t strcpy_s(char* dest, rsize_t dest_size, const char* src)
{
	rsize_t idx = 0;

	dest_size -= 1;

	while (idx < dest_size && src[idx] != 0)
	{
		dest[idx] = src[idx];
		idx++;
	}

	dest[idx] = 0;

	return 0;
}

int main(void)
{
	char str1[100] = "nice ";
	char str2[] = "to meet you";

	printf("%s\n", str1);

	strcpy(str1, str2);
	printf("%s\n", str1);
    
	char str3[5];
	strcpy_s(str3, 5, str2);
	printf("(3)%s\n", str3);

	return 0;
}

 


 

* strcat 문자열 붙이기

char *strcpy(
   char *strDestination,
   const char *strSource
);

 

strDestination

 : 대상 문자열

strSource

 : 대상 문자열에 붙일 문자열

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strcpy-wcscpy-mbscpy?view=msvc-170

 

strcpy, wcscpy, _mbscpy

자세한 정보: strcpy, wcscpy, _mbscpy

learn.microsoft.com

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strcpy-s-wcscpy-s-mbscpy-s?view=msvc-170

 

strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l

자세한 정보: strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l

learn.microsoft.com

 

#include <stdio.h>

char* strcat(char* dest, char* src)
{
	int destIdx = 0;
	int scrIdx = 0;

	while (dest[destIdx] != 0)
	{
		destIdx++;
	}

	while (src[scrIdx] != 0)
	{
		dest[destIdx] = src[scrIdx];
		scrIdx++;
		destIdx++;
	}

	dest[destIdx] = 0;

	return dest;
}

errno_t strcat_s(char* dest, int dest_size, char* src)
{
	int destIdx = 0;
	int scrIdx = 0;

	dest_size -= 1;

	while (destIdx < dest_size && dest[destIdx] != 0)
	{
		destIdx++;
	}

	while (destIdx < dest_size && src[scrIdx] != 0)
	{
		dest[destIdx] = src[scrIdx];
		scrIdx++;
		destIdx++;
	}

	dest[destIdx] = 0;

	return 0;
}

int main(void)
{
	char str1[100] = "nice ";
	char str2[] = "to meet you";

	printf("(1)%s\n", str1);

	//strcat(str1, str2);
	strcat_s(str1, sizeof(str1), str2);
	printf("(2)%s\n", str1);

	return 0;
}

 


 

* strcmp 문자열 비교

int strcmp(
   const char *string1,
   const char *string2
);

 

string1, string2

 : 비교할 문자열

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strcmp-wcscmp-mbscmp?view=msvc-170

 

strcmp, wcscmp, _mbscmp, _mbscmp_l

자세한 정보: strcmp, wcscmp, _mbscmp, _mbscmp_l

learn.microsoft.com

 

#include <stdio.h>

int strcmp(const char* string1, const char* string2)
{
    int diffNum;
    int idx = 0;

    while (string1[idx] != 0)
    {
        diffNum = (unsigned char)string1[idx] - (unsigned char)string2[idx];

        if (diffNum != 0)
            return diffNum;

        idx++;
    }

    return (unsigned char)string1[idx] - (unsigned char)string2[idx];
}

int main(void)
{
	char str1[100] = "nice ";
	char str2[] = "to meet you";
    
	printf("%d\n", strcmp(str1, str2));
	printf("%d\n", strcmp(str2, str2));
	printf("%d\n", strcmp(str2, str1));

	return 0;
}

 

* C표준두 문자열의 첫 번째 다른 문자의 아스키 값 차이를 반환하고

   비주얼 스튜디오의 MSVC의 구현아스키 차이를 무시하고, 결과를 -1, 0, 1로 단순화 한다

   [왜] 비주얼 스튜디오의 MSVC의 구현은 최적화를 통해 반환값을 단순화한다고 함

 

unsigned char 변환을 사용하는 이유
   아스키 범위(0 ~ 127)에서는 부호 확장 문제가 발생하지 않는다.
   그러나 C 문자열은 확장 아스키(128 ~ 255)도 포함될 수 있으므로, 부호 확장 문제가 발생할 수 있다

   따라서, 확장 아스키 문자(128 ~ 255)나 특수 문자(\xFF, \x80 등)을 올바르게 처리하여
   문자열의 모든 문자를 0 ~ 255 범위로 해석하고, 비교 결과의 왜곡(잘못된 값)을 방지하기 위함이다

 


 

* strchr 문자열에서 문자 검색

char *strchr(
   const char *str,
   int c
);

 

str

 : 대상 문자열

c

 : 검색할 문자

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strchr-wcschr-mbschr-mbschr-l?view=msvc-170

 

strchr, wcschr, _mbschr, _mbschr_l

자세한 정보: strchr, wcschr, _mbschr, _mbschr_l

learn.microsoft.com

 

#include <stdio.h>

char* strchr(const char* str, int c)
{
	int idx = 0;

	while (str[idx] != 0)
	{
		if (str[idx] == c)
		{
			return (char*)&str[idx];
		}

		idx++;
	}

	return nullptr;
}

int main(void)
{
	char str1[100] = "nice ";
	char str2[] = "to meet you";
	
	printf("%p\n", strchr(str2, 'a'));
	printf("%p\n", strchr(str2, 'm'));

	return 0;
}

 


 

* strstr 문자열에서 문자열 검색

char *strstr(
   const char *str,
   const char *strSearch
);

 

str

 : 대상 문자열

strSearch

 : 검색할 문자열

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strstr-wcsstr-mbsstr-mbsstr-l?view=msvc-170

 

strstr, wcsstr, _mbsstr, _mbsstr_l

자세한 정보: strstr, wcsstr, _mbsstr, _mbsstr_l

learn.microsoft.com

 

#include <stdio.h>

char* strstr(const char* str, const char* search)
{
	int strIdx = 0;
	int searchIdx, tempIdx;

	while (str[strIdx] != 0)
	{
		tempIdx = strIdx;
		searchIdx = 0;

		while (search[searchIdx] != 0 && str[tempIdx] == search[searchIdx])
		{
			tempIdx++;
			searchIdx++;
		}

		if (search[searchIdx] == 0)
			return (char*)&str[tempIdx - searchIdx];

		strIdx++;
	}

	return nullptr;
}

int main(void)
{
	int result;
	char* dpdest;

	char string[] = "nice to meet you";
	const char* str = "hello world, hello C!";

	printf("%s\n", strstr(str, "world"));	// "world, hello C!"
	printf("%s\n", strstr(str, "hello"));	// "hello world, hello C!"
	printf("%s\n", strstr(str, "C++"));	// (NULL 출력)
	printf("%s\n\n", strstr(str, ""));	// "hello world, hello C!"

	printf("%s\n", strstr("ababc", "abc"));

	printf("\n\n%p\n\n", string);

	dpdest = strstr(string, "nice");
	printf("%s, %p\n", dpdest, dpdest);

	dpdest = strstr(string, "shine");
	printf("%s, %p\n", dpdest, dpdest);

	dpdest = strstr(string, "to");
	printf("%s, %p\n", dpdest, dpdest);

	dpdest = strstr(string, "meet");
	printf("%s, %p\n", dpdest, dpdest);

	dpdest = strstr(string, "you");
	printf("%s, %p\n\n", dpdest, dpdest);

	printf("%s\n", strstr("ababababc", "abc"));	// "abc"
	printf("%s\n", strstr("abababab", "ababa"));	// "abababab"
	printf("%s\n", strstr("mississippi", "issip"));	// "issippi"
	printf("%s\n", strstr("abcde", "cde"));		// "cde"
    
	return 0;
}

 


 

* _strlwr  문자열 소문자 변환

char *_strlwr(
   char * str
);

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/strlwr-wcslwr-mbslwr-strlwr-l-wcslwr-l-mbslwr-l?view=msvc-170

 

_strlwr, _wcslwr, _mbslwr, _strlwr_l, _wcslwr_l, _mbslwr_l

자세한 정보: _strlwr, _wcslwr, _mbslwr, _strlwr_l, _wcslwr_l, _mbslwr_l

learn.microsoft.com

 

#include <stdio.h>

#define CHANGE_LOWER 'a' - 'A'
char* _strlwr(char* str)
{
	for (int idx = 0; str[idx] != '\0'; idx++)
	{
		if ('A' <= str[idx] && 'Z' >= str[idx])
		{
			str[idx] += CHANGE_LOWER;
		}
	}

	return str;
}

int main(void)
{
	char str1[] = "ABC";
	char str2[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZaabbcczz123456!!~~";
	
	printf("%s\n", _strlwr(str1));
	printf("%s\n", _strlwr(str2));

	return 0;
}

 


 

* intptr_t와 uintptr_t

   C99 표준(stdint.h)에서 제공하는 자료형으로, 포인터와 동일한 크기를 가지는 정수형