* strlen 문자열 길이 계산
size_t strlen(
const char *str
);
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
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
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
: 검색할 문자
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
: 검색할 문자열
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
);
_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)에서 제공하는 자료형으로, 포인터와 동일한 크기를 가지는 정수형
'IT공부' 카테고리의 다른 글
[운영체제] 시스템 콜(System Call) (0) | 2025.02.27 |
---|---|
[C] C언어 전역변수, static 변수 vs Java static 변수 (0) | 2025.02.11 |
[ETC] 메모리 원자성과 DB 원자성 (0) | 2025.01.24 |
[C++] 접근 제어자 private 자바와의 차이점 (0) | 2024.12.29 |
[ETC] 레드 블랙 트리 (0) | 2024.12.19 |