C언어 14

[C언어] malloc 동적할당을 이용한 배열 출력, 역으로 출력(포인터, 이중포인터)_더쉬운방법

전에 올린 글에서 너무 어렵게 풀었다.. 더 쉽게 풀 수 있는 방법이 있었다. arr[i]와 *(arr+i)가 동일함을 잊지말것! malloc함수가 배열을 주는 것이 아님... //두개의 1차원 배열을 포함하는 포인터 배열을 선언하고 출력 //이중포인터 이용 포인터 배열 내 mat1과 mat2 위치 바꾸어 출력 #include #include int* input(int* x, int s); void change(int** x); int main(void) { int n, m,i;//n,m : 각각의 배열 크기/i : 반복문에 쓰일 변수 printf("각각의 배열 몇개?: "); scanf("%d %d", &n, &m); //malloc이용해 배열생성 int *mat1 = (int *)malloc(size..

[C언어] 파일 입출력

스트림(Stream) 프로그램과 파일 사이에 데이터가 이동할 수 있는 다리 1바이트(byte) 단위로 저장 파일이 필요한 이유: 하드디스크에 파일 형태로 저장해야 전원 꺼져도 데이터가 보존 파일 C에서의 파일은 일려의 연속된 바이트 파일열기->파일 읽기와 쓰기->파일 닫기 fopen 함수 스트림 형성할때 호출하는 함수 #include FILE * fopen(const char * filename, const char * mode) FILE

[C언어] 구조체 (Structure)

구조체 데이터를 하나로 모으기 위함 지금까진 개별 변수로 나타냈음. struct student{ int number; //학번 char name[10]; //이름 double grade; //학점 };//세미콜론 잊지말기!!! 함수내에서 사용할때 int main(void){ struct student s1;//구조체 변수 선언 ... } 구조체 초기화 //함수 밖에서도 초기화 가능한듯 struct student s1={24,"KIM",4.3}; //number=24, name[0]='K',name[1]='I', name[2]='M', name[3]=\0, grade=4.3 구조체 멤버의 접근 구조체 변수의 멤버에 접근할라면 dot(.)연산자 사용 Typedef 이용 typedef struct studen..

[C언어] 문자 역으로 출력, strncat/strlen활용

str1[100]에 문장을 저장 str2[100]에 입력 받은 문장 strncat/strlen 활용 #include #include int main(void) {//ex. hello int len;//문자열 길이 char str1[100]; printf("Please input the sentence : "); gets(str1);//100글자 이내의 문장을 입력받아 str배열에 저장 len=strlen(str1);//문자열 길이, 5 char str2[len+1];//strlen사용, 6 길이의 배열 \0을 포함해야하기 때문 //처음에 초기화 시킬때랑 실제 배열 사용할때가 구별되야함. 배열 사용할땐 -1 for(int i=0;i

[C언어] puts, printf / gets, scanf(scanf_s)

puts와 printf puts()는 문자열만 출력, printf()는 문자열 및 여러가지 정보를 서식화 하여 출력하는 함수. printf()가 더 다양한 곳에 사용될 수 있음. gets와 scanf_s gets(str1);은 scanf_s("%[^\n]",str1)//엔터키를 제외한 모든값을 받는다. 공백도 가능 %[a-z]는 소문자만 입력받는다는 것이다. 과 같다. gets는 오류가 나는 경우가 종종 있어서 이렇게 쓰면 오류가 나지 않았다.

[C언어] 메모리 공간의 동적 할당

가상메모리의 4대 영역 { 코드영역, 데이터영역, 힙영역, 스택영역 } 코드 영역: 실행할 프로그램의 코드 저장 공간 데이터영역 : 프로그램이 종료될 때까지 유지할 데이터 저장 공간 힙 영역 : 프로그래머가 원하는 형태로 쓸 수 있는 공간 스택 영역 : 잠깐 사용하고 삭제할 데이터 저장 공간 정적 메모리 할당 -프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당 -할당된 크기보다 더 큰 입력은 X -작은건 메모리 낭비 ex) int i, j; int buffer[80]; 지역변수, 전역변수 동적 메모리 할당 -실행 도중에 메모리 할당 -사용 끝나면 메모리 반납 -malloc() 계열의 라이브러리 함수를 사용 *run-time때 배열의 크기를 정하기 위해서는 배열을 힙 영역에다가 할당해야 함. -배..

[C언어] 문자열 관련

아스키코드 -128개로 구성, 따라서 7개의 비트로 표현가능 -대소문자간의 값의 차는 32(대문자가 먼저임) 문자(character)의 표현 방법 -따옴표로 묶어서 표현 -%c 사용하여 출력 컴파일러 -문자데이터를 아스키코드로 변경시킴 -%c 전달 시 아스키코드 값을 아스키코드 문자로 변환시킨다. 문자열(string) -문자열 변수 : 변경가능한 문자열을 저장할 수 있는 변수 -'A':문자 -"A":문자열 -출력할때 %s 사용 NULL 문자 -문자열의 끝을 나타낸다. (\0) -어디서 종료되는지 알 수 가 없어 표시가 필요 -NULL이 없으면 쓰레기값이 들어감 -문자(character)에는 \0값이 안들어감 그냥 1byte BUT 문자열에는 뒤에 \0dl emfdjrka (ex. 똑같이 A를 써도 문자에..

[C언어] 포인터 배열, 헷갈리는 부분들

포인터 배열 int* arrPtr[i] -> int형 포인터 변수 i개로 이뤄진 1차원 배열 총 i개의 주소값 저장가능 1. int arr[]={1, 2, 3, 4, 5}; int* p = arr; // int* p = &arr[0]; arr 2. 배열 이름 관점에서 arr[i]와 *(arr+i)가 동일 arr[i]와 *(arr+i)는 동일한 문장 -arr[i]는 배열의 이름을 이용할때 사용 -*(arr+i)는 포인터를 이용할때 사용 3.매개변수 선언을 포인터 관점에서 void func(int* arr, int len){ ...// 여기서 int* arr은 int arr[]로 대체가능 } 4.int arr[] 유형의 선언은 매개변수 선언에서만 사용이 가능 5.Call-By-Value & Call-By-R..

[C언어] dptr을 이용해 *ptr1과 *ptr2 관계 서로 바꾸기

이중포인터를 이용해 포인터 관계 바꾸기 ▷ 정수형 변수 n1과n2에값을 입력 받은 후, 각각 n1과n2의주소를 저 장하는 포인터 변수 ptr1, ptr2를선언 ▷ ptr1의주소를 저장하는 이중 포인터 dptr을선언 ▷ dptr만을 이용하여 관계바꾸기 ex)n1=10, n2=20일때 결과물은 *ptr1=20, *ptr2=10, **dptr=10이 나오게 관계를 바꿔줘야함 int main(void) { int n1, n2; int* ptr1, * ptr2; printf("Input n1, n2 : "); scanf_s("%d %d", &n1, &n2); ptr1 = &n1; ptr2 = &n2; int** dptr = &ptr1; *dptr = &n2; dptr = &ptr2; *dptr = &n1; pri..