본문 바로가기
IT/C

[C언어] strlen(), fgets(), strcat(), strncpy() 함수

by 고간디 2024. 3. 20.

[동아리] A반 4차 2일 과제 (2024.03.18)

strlen, fgets, strcat, strncpy 함수 사용하기

 


strlen fgets strcat strncpy 네 가지 함수 모두 string,h 헤더 파일에 선언되어 있는 함수이다.

string,h 헤더파일에는 문자열을 다루는 여러 가지 함수가 선언되어 있다. 

 

strlen( )

strlen() 함수는 저장된 문자열의 길이를 반환하는 함수이다. 

#include <stdio.h>
#include <string.h>

int main() {
    char *str1 = "Hello";
    char str2[10] = "Hello";
    
    printf("%d\n", strlen(str1));	// 5
    printf("%d\n", strlen(str2));	// 5

    return 0;
}

포인터를 사용해서 지정된 주소에 문자열을 저장할 수도 있고, 배열을 초기화하여 문자열을 저장할 수도 있다.

strlen()은 인자로 받은 문자열의 길이를 정수로 출력한다.

문자열을 저장한 str2 배열의 크기는 10이지만 strlen()을 사용할 경우 문자열의 \0 (NULL) 문자를 제외한 문자열의 길이를 반환한다.

 


fgets( )

fgets() 함수는 인자를 세 개 갖는데 각각 문자열 저장 변수, 저장할 문자열 최대 길이, 문자열을 불러올 파일 및 경로이다.

터미널에 입력한 문자열을 저장하는 기능 외에도 다른 외부 txt 파일 등에서도 문자열을 가져와 저장할 수 있다.

#include <stdio.h>
#include <string.h>

int main() {
    char str2[10];
    
    fgets(str2, 10, stdin);
    printf("%s", str2);

    return 0;
}

세번째 인자인 문자열을 저장할 위치를 stdin으로 전달하면 터미널에 사용자가 입력한 문자열을 str2라는 변수에 저장하게 된다.

 

앞서 언급한 txt 등 외부 파일에서 문자열을 가져올 경우 fopen 또는 fclose 등의 함수와 함께 사용한다.

 


strcat( )

두 개의 인자를 받는데 두 인자 모두 문자열을 받아 문자열끼리 합치는 함수이다.

#include <stdio.h>
#include <string.h>

int main() {
    char str1[30] = "it is";
    char str2[10] = " test";
    
    strcat(str1, str2);
    printf("%s", str1);

    return 0;
}

 

위 코드에서 str1 과 str2 문자열 변수의 크기를 각각 30과 10으로 해주었는데 str1 배열 크기를 6으로 할 경우 strcat으로 합쳐도 배열의 크기가 작아 합친 결과가 제대로 출력되지 않는다.

때문에 문자열의 배열 크기 설정 시 합쳐진 문자열의 길이를 고려해 설정해야 한다.

 


strncpy( )

복사할 위치, 복사할 문자열, 복사할 문자열의 길이 이 세 가지의 인수를 순서대로 받는 문자열 복사 함수이다.

복사할 위치에 복사할 문자열을 입력받은 길이만큼 복사하여 붙여넣는다.

#include <stdio.h>
#include <string.h>

int main() {
    
    char str1[30] = "original";
    char str2[20] = "copy";
    
    strncpy(str1, str2, 4);
    printf("%s\n", str1);	// copyinal
    
    strncpy(str1, str2, 5);
    pritnf("%s", str1);	//copy
        
    return 0;
}

str2를 4길이만큼 str1 포인터로 복사하면 copyinal이 출력된다.

str2를 5길이만큼 복사하면 str2의 빈 공간에 채워진 \0(NULL)값이 함께 복사되면서 copy만 출력된다.

이는 컴퓨터가 \0 문자를 문자열의 끝으로 인식하기 때문이다. 

 


과제 구현

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

int main(void) {
	// strlen, fgets, strcat, strncpy
	char str1[100];
	char str2[100];

	printf("추가할 문자열1을 입력하세요: ");
	fgets(str1, strlen(str1), stdin);
	printf("추가할 문자열2를 입력하세요: ");
	fgets(str2, strlen(str2), stdin);

	str1[strlen(str1) - 1] = '\0';

	char original[100] = "Hello, ";
	printf("연결 전: %s\n", original);
	strcat(str1, str2);
	strcat(original, str1);
	printf("연결 후: %s", original);

	char before[50] = "before";
	char copy[10];
	printf("복사할 문자열을 입력하세요: ");
	fgets(copy, strlen(copy), stdin);
	printf("복사 전: %s\n", before);
	strncpy(before, copy, strlen(copy)+1);
	printf("복사 후: %s\n", before);

	return 0;
}

fgets, strlen, strncpy, strcat 네 가지 함수를 모두 사용하여 문자열을 다루는 프로그램을 작성한다.

fget() 함수의 경우 문자열의 입력을 \n 마지막 개행 문자까지 받기 대문에 strcat을 사용하면 개행 문자와 함께 문자열이 합쳐져서 배열을 활용하여 개행 문자를 \0 값으로 바꾸어 주어서 해결한다.

728x90
반응형

댓글