본문 바로가기

C언어/복습

[C언어]DAY15_ 포인터 배열, 더블포인터, 문자열 표준 라이브러리

포인터 배열, 더블포인터

: 포인터를 원소로 갖는 배열

//문자열을 위한 문자열 포인터 배열

 

#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)