강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

wjdwn535님의 프로필 이미지
wjdwn535

작성한 질문수

홍정모의 따라하며 배우는 C언어

11.6 다양한 문자열 함수들

11.6 my_strcat과 my_strncat을 구현해봤습니다.

해결된 질문

작성

·

24

1

void my_strcat(char* str1, char* str2)
{
	char* st1 = str1;
	st1 = st1 + strlen(st1);


	for (int i = 0; *(str2 + i) != '\0'; i++) *(st1 + i) = str2[i];
	
}

void my_strncat(char* str1, char* str2, unsigned int loc)
{
	char* st1 = str1;
	st1 = st1 + strlen(st1);

	for (int i = 0; *(str2 + i) != '\0' && i < loc; i++) *(st1 + i) = str2[i];
}

답변 2

0

안녕하세요? 질문&답변 도우미 durams입니다.

잘 작성해주셨네요. 다만 잠재적으로 위험한 부분이 두 가지 있습니다.

  1. 완성된 문자열의 끝에 널 문자를 붙여주는 코드가 없기 때문에, 이 문자열을 다른 C스타일 문자열 처리 함수에 인자로 전달한다면 널 문자를 찾지 못해 예상한 대로 동작하지 않을 수 있습니다.

  2. 아직 동적 메모리 할당과 관련 내용에 대해 배우지 않으셨으니 짧게만 어떤 문제점이 있을 수 있는지 알려드릴게요.


    현재 코드에서는 str1의 시작 주소와 str1의 길이를 활용하여 str1이 끝나는 위치부터 str2를 붙이고 있습니다. 하지만 이런 동작이 안전하게 수행되려면 str1이 끝나는 위치 이후 삽입될 문자열의 크기만큼 여유 공간이 있어야 하겠죠. (my_strcat의 경우 strlen(str2) 만큼, my_strncat의 경우 loc 만큼) 하지만 현재 코드에서는 그런 동작을 보장하지 않습니다.


    직접 문자열을 전달해서 테스트해보셔도 좋구요, 일단은 그렇구나 하고 넘어가시고 동적 메모리 할당 관련 내용을 배우고 난 후 다시 구현해보셔도 좋습니다.
    다른 방법으로는 '해당 배열에 대해 허용된 크기'를 함수에 전달하여 처리하셔도 됩니다.

0

안녕하세요, 인프런 AI 인턴입니다. wjdwn535님.

my_strcat과 my_strncat 함수 구현을 진행하셨군요! 기본적인 기능은 잘 구현하신 것 같습니다. 그러나, 문자열을 연결할 때 널 문자(‘\0’)를 붙여주지 않으면 연결된 문자열이 예상과 다르게 작동할 수 있습니다. 추가적인 변경이 필요합니다. 아래 URL에서는 유사한 문자열 처리 함수 구현에 대한 답변이 있으니 참고하시기 바랍니다.

예를 들어, strcat 함수에서는 연결된 문자열 끝에 ‘\0’을 추가해주는 것이 중요합니다.

관련 질문

해당 질문의 답변에서는 코드를 기능적으로 유지하기 위한 조언과 추가 구현을 위한 팁을 찾으실 수 있을 것입니다. 특히 문자열 함수 구현에 단순히 활용할 수 있는 기능 외에 효율성이나 안정성 측면도 고려해보시면 나중에 큰 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

wjdwn535님의 프로필 이미지
wjdwn535

작성한 질문수

질문하기