문자열은 char타입의 배열의 각 칸마다 문자 하나씩 저장이 됩니다.
char str[6]; str[0] = "h"; str[1] = "e"; str[2] = "l"; str[3] = "l"; str[4] = "o"; str[5] = "\0"; // 문자열 끝을 표시하는 역할 & 배열의 크기는 문자 길이보다 1커야함
이렇게 일일이 저장하는 일은 매우 귀찮은 일입니다.
그래서 C 언어에서는 문자열을 생성하는 편리한 방법을 제공합니다.
char str[] = "hello";
or
char *str = "hello";
하지만 포인터 변수로 선언한 String 은 수정이 불가능합니다.
이것을 String Literal 이라고 부릅니다.
#include <stdio.h>
#define BUFFER_SIZE 100
int main(void) {
char *words[100];
int n = 0;
char buffer[BUFFER_SIZE];
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;
};
words 의 포인터 배열을 선언하고
while 문을 통해서 buffer에 입력한 값을 words에 넣어줍니다.
그다음 for문을 통해서 words의 값들을 순서대로 출력합니다
first
second
third
fourth
//입력값
fourth
fourth
fourth
fourth
//출력값
위와 같은 출력이 됩니다.
이렇게 된 이유는 words에 계속 같은주소에 덮어쓰기가 되었다고 생각하시면 됩니다.
그렇다면 입력된값을 words에 복사를 진행한다면?
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 100
int main(void) {
char *words[100];
int n = 0;
char buffer[BUFFER_SIZE];
while (n < 4 && scanf("%s", buffer) != EOF) {
words[n] = strcpy(words[n], buffer);
n++;
}
for (int i = 0; i < 4; ++i) {
printf("%s\n", words[i]);
}
return 0;
};
출력값을 볼 필요도 없이 exit code에서 에러가 발생합니다.
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 100
int main(void) {
char *words[100];
int n = 0;
char buffer[BUFFER_SIZE];
while (n < 4 && scanf("%s", buffer) != EOF) {
words[n] = strdup(buffer);
n++;
}
for (int i = 0; i < 4; ++i) {
printf("%s\n", words[i]);
}
return 0;
};
strcpy 함수가 아닌
strdup 함수를 사용하여 words 포인터 배열에 값을 복사하여 넣는다면!
first
second
third
fourth
//입력값
first
second
third
fourth
//출력값
다음과 같이 정상적으로 값이 입력된 순서대로 출력되는것을 확인하고,
words 포인터 배열에 올바르게 값이 넣어진것 또한 확인 할 수 있습니다.