strcat과 strncat은 모두 문자열에 문자를 추가하는 함수라는 것을 모두 알고 있습니다. 그들의 원칙은 무엇입니까?
우선, 우리는 그것들을 구별 할 수 있도록 둘의 원칙을 이해해야합니다;
strcat-call strcat 함수의 사용법, 두 개의 문자열 배열 또는 문자열 배열과 문자열 전달, string.h 헤더를 호출해야합니다. 파일;
char arr1[30] = "abcd";
char arr2[] = "efd";
strcat(arr1, arr2);
----------------------
strcat (str,"concatenated.")
소스 코드는 (내가 직접 구현했습니다. 실제 소스 코드와는 다르지만 원칙은 동일합니다.)
1 단계 : 추가 된 문자열의 포인터를 문자열 '\ 0'에 가리 킵니다
. 2 단계 : 변경 추가 된 문자열의 '\ 0'으로 문자열 추가
Step 3 : str의 마지막 위치를 '\ 0'으로 설정
void strcat(char* str, const char* d)
{
while (*str)
str++;
while (*d != '\0')
{
*str = *d;
str++;
d++;
}
str++;
*str = '\0';
}
int main()
{
char arr1[30] = "abcd";
char arr2[] = "efd";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strncat의 사용법은 strncat 함수를 호출하고 두 개의 문자열과 정수 값을 전달합니다. 정수 값은 추가 할 문자 수를 나타냅니다. string.h 헤더 파일을 호출해야합니다.
char str1[20] = "abcde";
char str2[20] = "cdefad";
strncat (str1, str2, 6);
소스 코드 :
1 단계 : arr1의 포인터를 '\ 0'으로 이동
2 단계 : arr2가 가리키는 요소를 arr1이 가리키는 요소와 교환합니다.
void my_strncat(char* arr1, char* arr2, int len)
{
assert(arr1);
assert(arr2);
arr1 = arr1 + len;
while (len-- != 0)
{
//第一步:先把arr1的指针移到'\0'处
//第二步:把arr2所指向的元素与arr1所指向的元素交换;
*arr1 = *arr2;
arr1++;
arr2++;
}
}
int main()
{
char arr1[30] = "abcdeef";
int len = strlen(arr1);
my_strncat(arr1, arr1, len);
printf("%s\n", arr1);
return 0;
}
두 매개 변수가 일치하지 않지만 효과는 동일하다는 것을 분명히 알 수 있습니다. 두 가지의 주요 차이점은 strcat ()의 추가 된 문자열의 종료 조건이 str2 == '\ 0'(str2 is required 추가 된 문자열 strncat의 루프 끝에 대한 조건은 추가 될 문자열의 수가 0이라는 것입니다.
그렇다면 왜 같은 효과를내는 두 가지 기능이 있어야할까요?
둘의 구현 효과는 동일하지만 원래 문자열에 원래 문자열을 추가하려는 경우 strncat 함수 만 사용할 수 있습니다.
char arr1[30] = "abcd";
strcat(arr1, arr1);
strcat은 기본적으로 추가 할 문자열의 '\ 0'을 추가 된 문자열의 요소와 교환하기 때문에 추가가 자체 일 때 '\ 0'이 이전 요소와 교환되고 나중에 모든 교환이 완료되면 '\ 0'이 다시 돌아가서 종료 조건이 더 이상 설정되지 않고 무한 루프에 빠질 것입니다 .strcat ()의 편의는 두 개만 전달하면 달성 할 수 있다는 것입니다. 상대적으로 간단한 매개 변수;
단, 위에서 언급 한 무한 루프에 빠질 가능성이 없기 때문에 strncat ()을 사용하는 것이 좋습니다. 최대 1 개의 스텝 길이 (strlen (array name))를 세고 strncat ()은 필수 불가결 한 이점, 즉 자유 추가 할 문자를 제어합니다.