IT 프로그래밍/자료구조

[C언어] 문자열 string, fgets 설명

기술1 2024. 9. 6. 20:21
반응형

string

C에서의 문자열은 char 타입 배열에 저장됩니다. 각 칸마다 하나의 문자가 저장되는데요.

char str[6];
str[0] = 'h';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';
str[5] = '\0';

null character('\0')는 문자열의 끝을 표시하는 역할을 합니다. 즉 배열의 크기가 문자열의 길이보다 적어도 1만큼 길어야합니다. 

 

c언어는 문자열을 생성하는 편리한 방법을 제공합니다.

char str[] = "hello"; //길이가 6인 문자배열이 만들어지고 "hello"와 \0 까지 저장된다.
char *str = "hello"; //이것은 수정이 불가능하다.

 

string.h 라이브러리의 다양한 함수

  • strcpy 문자열 복사
  • strlen 문자열의 길이
  • strcat 문자열 합치기
  • strcmp 문자열 비교
#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "hello";
	char str2[] = "world!";

	printf("%d\n", strlen(str1));
	printf("%d\n", strlen(str2));

	char str3[20];
	strcpy(str3, str1);
	printf("%s\n", str3);

	strcat(str3, str2);
	printf("%s\n", str3);

	int result = strcmp(str1, str2);
	printf("%d\n", result); 

	result = strcmp(str2, str1);
	printf("%d\n", result);

	char str4[] = "hello";
	result = strcmp(str1, str4);
	printf("%d\n", result);

	return 0;
}

이렇게 각 역할을 판단하는 코드가 있습니다. 

 

C에서의 문자열들의 저장

C언어는 문자열에 관해서 많은 기능을 제공하지 않고 있습니다.  

 

C언어에는 string이라는 데이터 타입이 존재하지 않습니다. 그렇기 때문에 하나의 배열을 만들고 각각의 문자열은 character 배열일 수밖에 없기 때문에 독립적으로 저장을 하고 시작 주소를 words라는 배열에 저장을 해놓는 것이 가장 간명하고 군더더기가 없는 자료구조가 됩니다. 

#include <stdio.h>
#include <string.h>
#define MAXWORDS 100
#define MAXLEN 30
int main()
{
	char* words[MAXWORDS];
	int n;
	scanf("%d", &n);

	char buf[MAXLEN];
	for (int i = 0; i < n; i++) {
		scanf("%s", buf);
		words[i] = strdup(buf);
	}
	

	for (int i = 0; i < n; i++) {
		printf("%s\n", words[i]);
	}

	return 0;
}

strdup는 매개변수로 받는 하나의 문자열을 복제하여 반환합니다. strdup는 string.h 라이브러리가 제공하므로 직접 구현할 필요는 없습니다. 

char* strdup(char* s) {
	char* p;
	p = (char*)malloc(strlen(s) + 1);
	if (p != NULL)
		strcpy(p, s);
	return 0;
}

strdup 안에서 동적메모리 할당을 합니다. 동적으로 할당된 이것은 free 시켜주지 않는 한 삭제되지 않는다는 것이 있습니다. 그래서 매우 주의해서 해야 하는 것입니다. 

 

C에서 라인 단위로 입력받기 : fgets

#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 100

int main() {
	char buffer[BUFFER_SIZE];
	while (fgets(buffer, BUFFER_SIZE, stdin) != NULL) {
		if (buffer[strlen(buffer) - 1] = '\n')
			buffer[strlen(buffer) - 1] = '\0';

		printf("%s:%d\n", buffer, strlen(buffer));
	}

	return 0;
}

파일의 끝에 도달하면 NULL을 return해서 while문의 조건을 저렇게 둔 것입니다.

 

fgets는 각 라인 끝에 있는 '\n'까지 읽어줍니다. 만약 이 문자가 필요없다면 '\n'을 문자열의 끝을 표시하는 '\0'으로 변경합니다. 

 

fgets(buffer, BUFFER_SIZE, stdin)

여기에서 buffer는 사용자가 입력한 문자열을 저장할 배열입니다.

 

그리고 BUFFER_SIZE는 읽을 최대 문자의 개수를 나타냅니다. fgets는 BUFFER_SIZE -1만큼의 문자를 읽고 null을 추가하여 문자를 종료시킵니다.

 

stdin은 표준 입력을 나타냅니다. stdin은 기본적으로 키보드 입력을 받기 위한 파일 포인터로, 사용자가 키보드로 입력한 데이터를 받습니다.

반응형