포인터 배열, 더블포인터
: 포인터를 원소로 갖는 배열
//문자열을 위한 문자열 포인터 배열
#include
#define SIZE 3
int main(){
int i =0;
//여러개의 문자열을 선언하는 방법: 문자열 포인터를 이용하여
//비교 : 2차원배열로도 선언할 수 있다.
char* arr[SIZE] = {"Spring","comes", "soon"};
//포인터 배열을 더블포인터에 담는다.
char** pp_arr = arr; //arr, pp_arr 둘다 주소이다. 차이는 arr은 상수주소ㅡ pp_arr변수주소.
//싱수와 변수의 차이는 ++을 쓸수 있느냐의 차이를 제외하고는 완벽하게 동일하게 사용가능.
char p_arr[] = "hello";
//출력 []사용
//arr[i] = *(arr+i)
for( i =0; i<SIZE; i++){
//printf("%s\n", arr[i]);
printf("%s %d\n", *(arr+i), (arr+i));
}
for( i =0; i<SIZE; i++){
printf("%d %c\n", (p_arr+i), *(p_arr+i));
}
//pp_arr사용해서 출력
printf("pp_arr을 사용하여 출력\n");
for( i =0; i<SIZE; i++){
printf("%s\n", pp_arr[i]);
}
//pp_arr과 참조연산자 *를 사용하여 출력
printf("pp_arr와 *을 사용하여 출력\n");
for( i =0; i<SIZE; i++){
printf("%s\n", *(pp_arr+i));
}
}
//더블포인터의 사용 예: 문자열로 구성된 포인터 배열을 함수로 전달하기 위하여
#include <stdio.h>
#define SIZE 5
//포인터배열은 더블포인터로 받아야 한다. ***
void print_string(char**p_brand, int size) { //char** p_brand = brand;
int i =0;
for(i =0; i<size; i++){;
printf("%s\n", p_brand[i]);
}
//참조연산자 *를 사용해서 출력
for(i =0; i<size; i++){;
printf("%s\n", *(p_brand+i));
}
}
int main(){
//문자열로 구성된 포인터 배열
char* brand[SIZE] = {"LG", "Smasung", "Iphone", "Google", "Motolora"};
print_string(brand, SIZE);
//배열 포인터
//char(*brand)[COL]
}
*** 포인터배열은 더블포인터로 받아야 한다. ***
문자열 표준 라이브러리 standard library.
//string.h
//복사, 길이, 연결, 비교
#include <stdio.h>
#include <string.h>
#define MAX 100
void main(){
char str[MAX] = "Hello New World";
char str2[MAX] = "";
char *str3 = "Hello";
//문자열 길이 strlen()
printf("%d\n", strlen(str)); //null을 세지 않는다.
printf("%d\n", sizeof(str)); //sizeof는 배열의 크기. 할당된 메모리 사이즈.
//문자열 복사 : 뒤에 있는 인자에서 앞에 있는 인자로 복사가 됨.
printf("%s\n", str3);
strcpy_s(str2, sizeof(str2), str);
printf("%s\n", str2);
//strcpy_s(str3, sizeof(str3), str); ERROR! 포인터에는 복사할 수 없다.
//string을 저장할 수 있는 메모리가 확보되어 있지 않기때문에. 포인터(4byte)임. 주소만 저장가능.
//문자열 연결 contate 연결 뒤에 있는 인자에서 앞에 있는 인자로 연결됨.
strcat_s(str, sizeof(str), str2);
printf("%s\n", str);
printf("%s\n", str2);
//str2 = "hello"; EEROR! 배열의 이름은 상수 3=5 (x)
//str = "hello"; EEROR! 배열의 이름은 상수 3=5 (x)
//str3 = "hello"; 변수이므로 변경가능. (o)
strcpy_s(str2, sizeof(str2), "hello");
strcpy_s(str, sizeof(str), "hello");
printf("%s, %d\n", str, str);
printf("%s, %d\n", str2, str2);
//문자열 비교
printf("%d\n", str == str2); //주소를 비교
//내용 비교
printf("%d\n", strcmp(str, str2)); //strcmp의 결과는 같으면 0이 나옴.
strcpy_s(str, sizeof(str), "helloWorld");
printf("%d %d\n", strcmp(str, str2), strcmp(str, str2)==0);
}
//두개의 문자열을 비교하고자 한다. 같으면 true를 같지 않으면 false를 return하는 함수를 구현하세요.
//print_strings()는 두개의 문자열을 출력하는 함수 (선택)
//read_strings()는 두개의 문자열을 입력받는 함수 (선택)
#include <stdio.h>
#define MAX 100
#define TRUE 1
#define FALSE 0
int compare_strings(char* str1,char* str2){
int i =0;
for(i =0; i<MAX; i++){
if(str1[i] != str2[i]) return 0;
}
return 1;
}
int compare_strings2(char* str1,char* str2){
int i =0;
//str1 = abcde0
//str2 = abcde0
for(i =0; str1[i] !=0 || str2[i] != 0; i++){
if(str1[i] != str2[i]) return 0;
}
return 1;
}
//void print_strings(char* str1,char* str2){
// int i =0;
// for(i =0; i<MAX; i++){
// printf("%s %s", str1[i],str2[i]);
// }
//
//}
void main(){
char str1[MAX] = "abcde"; //int str1[MAX] = {1, 3, 4};
char str2[MAX] = "abcde"; //int str1[MAX] = {1, 3, 4, 5};
//read_strings(str1, str2);
//print_strings(str1, str2);
if(compare_strings2(str1, str2)){
printf("두 문자열은 같습니다\n");
}
else{
printf("두 문자열은 같지 않습니다\n");
}
}
***배열의 이름은 상수만 가능***
(1)
int size = 3;
int ar[size] = {0, }; (x)
(2)
#define MAX 3 (-> 상수이기 때문에)
int ar[MAX] = {0. }; (o)
'C언어 > 복습' 카테고리의 다른 글
[C언어]DAY17_동적 메모리 할당(문자열이 여러개인 경우), 구조체 선언 (0) | 2020.02.10 |
---|---|
[C언어]DAY16_동적 할당, 동적 배열 (0) | 2020.02.10 |
[C언어]DAY14_배열포인터 (0) | 2020.02.05 |
[C언어]DAY13_문자열 응용, 다차원 배열 (0) | 2020.02.05 |
[C언어]DAY12_문자열 (0) | 2020.02.01 |