Language/자료구조

[2] C review < 문자열 >

Return 2021. 11. 15. 21:32

문자열은 char타입의 배열의 각 칸마다 문자 하나씩 저장되는 형식입니다. 

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

literal이라는 말은 일반적으로 수정이 불가능하다고 생각하면 됩니다.

 

C언어에서  string.h라이브러리는 문자열을 다루는 다양한 함수를 제공합니다.

 

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

int main() {
	char word[10];
	word[0] = 'h';
	word[1] = 'e';
	word[2] = 'l';
	word[3] = 'l';
	word[4] = 'o';
	//word[5] = '\0';

	printf("% s", word);

	return 0;
}


======================================
hello儆儆儆儆儆?虧V綜[

앞에서 봤드이 마지막 문자열에 \0을 써줘야 합니다. 그렇지 않으면 위와 같이 이상한 값들이 도출되는 것을 알 수 있습니다.

 

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

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


int main() {

	char* words[100]; // 각각의 칸에 단어의 배열을 집어넣는다. > 각 주소에 집어넣는다. > 포인터
	int n = 0; //number of strings
	char buffer[BUFFER_SIZE];

	// scanf('%d',&a) > 하나의 정수를 읽어서 a라는 변수에다 저장해 달라는 요청
	// 그러므로 a의 주소값을 넘겨줘야 저장할 수 있기에 &연산자가 필요하다.
	// 문자열을 입력받을때에는 주소를 넘겨주는것이 아니라 배열을 넘겨주면된다.
	// 왜냐면 배열의 이름이 곧 주소이기 때문!!

	while (n < 4 && scanf("%s", buffer) != EOF) {

		words[n] = buffer;
		n++;
	}

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



===================입력값============================
aaaaa
bbbbb
ccccc
ddddd

===================출력값============================
ddddd
ddddd
ddddd
ddddd

 

words[n]도 char 형 포인터 변수이고 buffer도 배열의 포인터 변수이다. 즉, 포인터 변수간의 치환문입니다. 

차근차근 생각해보면, scanf로 문자열을 입력받으면 buffer에 저장되는데 포인터간의 치환문에 의해 words[0]이 buffer의 주소를 가리키게 됩니다. 그다음 또 다시 문자열을 입력받으면 새로운 buffer에 값이 저장되는데 마찬가지로 포인터간의 치환문에 의해 words[1]또한 buffer의 주소를 가리키게 됩니다. 즉 처음에 썻던 buffer의 값은 사라지고 가장 최신의 값이 buffer에 저장되기때문에 모든words배열이 동일한 하나의 buffer를 가리키게 되어 같은 값이 반복되는 것입니다. 

 

해결방안 ?  >> strdup 사용 

while (n < 4 && scanf("%s", buffer) != EOF) {

	words[n] = _strdup(buffer); //strcpy(str2,str1) strdup는 표준이 아니기 대문에 _strdup 사용 
	n++;
}

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

 

파일로부터 읽기 

 

파일을 열대 fopen, 'r'은 읽기 , 파일을 오픈하면 파일 포인터를 리턴, 파일로 부터 문자열을 하나씩읽어 출력