[C언어] strlen(), fgets(), strcat(), strncpy()
동아리 A반 4차 2일 과제
[동아리] A반 4차 2일 과제 (2024.03.18)
strlen, fgets, strcat, strncpy 함수 사용하기
strlen()
, fgets()
, strcat()
, strncpy()
네 가지 함수 모두 string.h
헤더 파일에 선언되어 있는 함수이다.
string.h
헤더파일에는 문자열을 다루는 여러 가지 함수가 선언되어 있다.
strlen( )
strlen() 함수는 저장된 문자열의 길이를 반환하는 함수이다.
1
2
3
4
5
6
7
8
9
10
11
12
#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 파일 등에서도 문자열을 가져와 저장할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
#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( )
두 개의 인자를 받는데 두 인자 모두 문자열을 받아 문자열끼리 합치는 함수이다.
1
2
3
4
5
6
7
8
9
10
11
12
#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( )
복사할 위치, 복사할 문자열, 복사할 문자열의 길이 이 세 가지의 인수를 순서대로 받는 문자열 복사 함수이다.
복사할 위치에 복사할 문자열을 입력받은 길이만큼 복사하여 붙여넣는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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 문자를 문자열의 끝으로 인식하기 때문이다.
과제 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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 값으로 바꾸어 주어서 해결한다.