문자열은 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'은 읽기 , 파일을 오픈하면 파일 포인터를 리턴, 파일로 부터 문자열을 하나씩읽어 출력
'Language > 자료구조' 카테고리의 다른 글
[5] C review < 전화번호부 알고리즘 version2.0 > (0) | 2021.11.22 |
---|---|
[4] C review < 전화번호부 알고리즘 version1.0 > (0) | 2021.11.22 |
[3] C review < 문자열 응용> (0) | 2021.11.16 |
[1] C review < 동적메모리 할당 > (0) | 2021.11.15 |
[0] C review < 포인터,배열,포인터 연산 > (0) | 2021.11.15 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!