YUIN

자료구조 2 [문자열] 본문

자료구조

자료구조 2 [문자열]

유_인 2023. 8. 3. 19:50

1. 문자열 (string)

 

- 문자열은 char 타입의 배열의 각 칸마다 문자 하나씩 저장된다

 

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

 

해당 코드는 문자열 hello를 생성한다.

이때, null character('\0')는 문자열의 끝을 표시하는 역할을 한다. 즉 배열의 크기가 문자열의 길이보다 적어도 1만큼 길어야 한다는 것이다. 또한 코딩에서 문자열의 시작은 0부터임에 주의하자. 

 

위의 코드는 아래의 코드와 같은 의미를 가지게 된다. 

char str[]="hello";
char *str="hello";
char *str="hello";

 

마지막 코드와 같이 정의된 문자열은 수정이 불가능하다는 점에서 첫번째, 두번째 코드와 차이 갖는다.

마지막 코드를 string literal 이라고 부르는데, 일반적으로 literal은 수정이 불가능하다는 뜻을 가진다.

 

2. string.h 라이브러리 함수

 

 - string.h 라이브러리는 문자열을 다루는 다양한 함수를 제공한다.

 

strcpy (string copy): 문자열 복사

strlen (string length): 문자열의 길이

strcat (string concatenation): 문자열 합치기

strcmp (string compare): 문자열 비교

 

3. 문자열들의 저장

 

- 여러 개의 단어들을 포인터를 이용하여 아래 그림과 같이 저장해보자

답:

#include <stdio.h>
#define BUFFER_SIZE 100

int main(){
	char* words[100];
	int n = 0; //number of strings
	char buffer[BUFFER_SIZE];
	while (scanf("%s", buffer) != EOF)  //scanf("%d,&a)
		//위 코드에서 buffer 앞에 &가 붙지 않는 이유?
		//buffer 배열의 이름이 실제 그 배열의 주소를 저장하고 있는 포인터 변수이기 때문
		//EOF: end of file
		words[n] = strdup(buffer);
		n++;
}

 

3. 문자열 복사: strdup

 

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

- 매개변수로 받은 하나의 문자열을 복제하여 반환한다. 

 

 

4. 파일로부터 읽기

 

-읽기(r)

#include <stdio.h>

void main(){
	FILE *fp =fopen("input.txt","r");
	char buffer[100];
	while(fscanf(fp,"%s",buffer) != EOF)
		printf("%s",buffer);
    fclose(fp);
}

 

-읽고 쓰기(r,w)

#include <stdio.h> 
void main() { 
 FILE * in_fp = fopen("input.txt", “r");
 FILE * out_fp = fopen("output.txt", "w");
 char buffer[100]; 
 while (fscanf(in_fp, "%s", buffer) != EOF) 
 fprintf(out_fp, ”%s ", buffer); 
 fclose(in_fp);
 fclose(out_fp); 
}