본문 바로가기

C lang

[C language] Geany편집기 - 2. scanf(값 읽기), atoi/atof(타입 변환_ 동적메모리할당), variable(변수)

#정리

** 포인터(*)는 고유메모리 주소를 가지는 변수로 4byte의 크기를 가지며, 자바의 new와 비슷하게 생각해볼 수 있다.
  - 자바의 주소가 4byte를 가지게 된 이유 (자바도 객체로 던지면 안에 내용에 상관없이 4byte로 전송된다.)

# scanf - 입력 값 받기
 //동적 메모리 할당  - #include <stdlib.h> // malloc, free 함수 사용
 - (변수=malloc(sizeof(int)) ~ free(변수))형태로 사용 : int만큼 메모리 공간 생성
 - char *변수 = malloc(sizeof(char)*10);//문자열 단위를 이용해서 10바이트까지 메모리 동적 할당
 - char *변수 = malloc(sizeof(name4));//name4 변수가 가지는 크기 만큼 메모리 동적 할당
//문자열 입력 받기 - scan("%숫자s",&변수명); : 숫자만큼 메모리 공간 생성 - 입력 요청 메세지는 따로 작성해야함 - scanf("%10s",name1);//입력 값을 변수에 할당//숫자 입력 받기 - scan("%?",&변수명);  - int변수 >> scanf("%d",&변수);//주소값이 있는 변수를 넣어줘야함. >> &를 붙이면 주소가 된다.
 - long변수 >> scanf("%ld",&su2);
 - float변수 >> scanf("%f",&floatsu3);//자리수(.2f) 지정 불가
 - double변수 >> scanf("%lf",&doublesu4);//자리수(.2lf) 지정 불가


# atoi/atof - 타입변환
<헤드 선언 필요 - #include <stdlib.h> //standard library >
//atoi : char to int //a는 문자를 의미
 - atoi(변수) 형태로 사용
//atof : char to float //a는 문자를 의미
 - atof(변수) 형태로 사용


# variable - 변수
//전역(global)변수 : 함수 밖에 작성, 파일 내에서 함수에 상관없이 자유롭게 사용가능하다.
 - int su = 100; //파일 내에서만 유효
 - static int su2 = 44; //static 효과가 다른 파일에서도 유효(프로그램이 실행 중일 때)
//지역(local)변수 : 함수 안에 작성, 블록 내에서 정의된 내용은 반영되지 않는다.
 - const int su3 = 88; //1회 초기화 이후 변경 불가 (읽기 전용)
 - auto int su = 333;//auto - 로컬변수 지정, 블록 내에서 아무것도 안적으면 auto가 작성된 것과 같다. 
//기타 변수
 - register int total = 100;//register : 변수를 메모리가 아닌 CPU에 할당하여 성능 향상을 유도할 수 있다.
 - volatile int total2 = 200;//volatile : 컴파일 최적화 과정을 제외하는 변수로 지정하여 성능향상을 유도할 수 있다.
  * iot센싱 할 때, 오작동 방지에 활용 가능하다.

 

 

** 포인터(*)는 고유메모리 주소를 가지는 변수로 4byte의 크기를 가지며, 자바의 new와 비슷하게 생각해볼 수 있다.

  - 자바의 주소가 4byte를 가지게 된 이유 (자바도 객체로 던지면 안에 내용에 상관없이 4byte로 전송된다.)

 

# scanf - 입력 값 받기

 //동적 메모리 할당 
 - #include <stdlib.h> // malloc, free 함수 사용

 - (변수=malloc(sizeof(int)) ~ free(변수))형태로 사용 : int만큼 메모리 공간 생성

 - char *변수 = malloc(sizeof(char)*10);//문자열 단위를 이용해서 10바이트까지 메모리 동적 할당

 - char *변수 = malloc(sizeof(name4));//name4 변수가 가지는 크기 만큼 메모리 동적 할당

//문자열 입력 받기 - scan("%숫자s",&변수명); : 숫자만큼 메모리 공간 생성
 - 입력 요청 메세지는 따로 작성해야함
 - scanf("%10s",name1);//입력 값을 변수에 할당
//숫자 입력 받기 - scan("%?",&변수명); 
 - int변수 >> scanf("%d",&변수);//주소값이 있는 변수를 넣어줘야함. >> &를 붙이면 주소가 된다.

 - long변수 >> scanf("%ld",&su2);

 - float변수 >> scanf("%f",&floatsu3);//자리수(.2f) 지정 불가

 - double변수 >> scanf("%lf",&doublesu4);//자리수(.2lf) 지정 불가

 

--예문 코드 보기--

더보기
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수 사용
int main(int argc, char **argv)
{
	printf("scanf..\n");
	
	//문자열 입력 받기
	printf("Input your name[10byte]: ");//입력 요청 메세지는 미리 작성해야함
	char name1[11];//최대 10바이트까지만 입력 가능
	scanf("%10s",name1);//입력 값을 변수에 할당
	printf("name1: %s\n",name1);//할당 값 출력
	
	//메모리 동적 할당 (변수=malloc(sizeof(int)) ~ free(변수))
	printf("Input your name[10byte]: ");
	char *name2 = malloc(sizeof(10));//10바이트까지 메모리 동적 할당
	scanf("%10s",name2);//입력 값을 변수에 할당
	printf("name2: %s\n",name2);//할당 값 출력
	free(name2);// 할당 해지 << 잊지 않게 주의
	
	
	//숫자 입력 받기 - scan("%?",&변수명); 
	printf("Input intsu[0~100]: ");
	int su;
	scanf("%d",&su);//주소값이 있는 변수를 넣어줘야하므로 숫자를 바로 넣진 못한다. >> &를 붙이면 주소가 된다.
	printf("intsu: %d\n",su);
	
	printf("Input longsu2[0~100]: ");
	long su2; 
	scanf("%ld",&su2);//주소값이 있는 변수 &su2 로 입력 필요
	printf("longsu2: %ld\n",su2);
	
	printf("Input floatsu3[0~100]: ");
	float floatsu3;
	scanf("%f",&floatsu3);//자리수(.2f) 지정 불가
	printf("floatsu3: %.2f\n", floatsu3);
	
	printf("Input doublesu4[0~100]: ");
	double doublesu4;
	scanf("%lf",&doublesu4);
	printf("floatsu3: %.2lf\n", doublesu4);
	
	return 0;
}

 


 

# atoi/atof - 타입변환

<헤드 선언 필요 - #include <stdlib.h> //standard library >
//atoi : char to int //a는 문자를 의미

 - atoi(변수) 형태로 사용

//atof : char to float //a는 문자를 의미

 - atof(변수) 형태로 사용

 

--예문 코드 보기--

더보기
#include <stdio.h>
#include <stdlib.h> //standard library : atoi 함수 사용

int main(int argc, char **argv)
{
	printf("----char to int : atoi()----\n");//a는 문자를 의미
	
	int num = 0;
	char str[10] = "2022";
	printf("%d, %s\n", num, str);
	
	//str변수값을 int로 변환
	num = atoi(str) + 10;
	printf("%d, %s\n", num, str);
	
	printf("---char to float : atof()-----\n");
	
	printf("Input pi: ");
	char pi[10];
	scanf("%s",pi);
	printf("su :%.2f\n",atof(pi)+33.333);
	
	return 0;
}

 


 

 

 

# score mission : 3명의 성적을 처리할 수 있도록 작성.

//char grade = 'A'; //한글자 할 땐 배열 크기 지정 안해도 크게 상관없음.

 

--예문 코드 보기--

더보기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
	printf("-------score mission------\n");
	
	printf("Input your name: ");
	char *name1 = malloc(sizeof(11));
	scanf("%10s",name1);
	printf("name1: %s\n", name1);
	free(name1);
	
	printf("Input your kor: ");
	int kor = 0;
	scanf("%d",&kor);
	printf("kor: %d\n", kor);
	
	printf("Input your eng: ");
	int eng = 0;
	scanf("%d",&eng);
	printf("eng: %d\n", eng);

	printf("Input your math: ");
	int math = 0;
	scanf("%d",&math);
	printf("math: %d\n", math);
	
	int total = kor+eng+math;
	float avg = total/3;
	//char grade[2] = "A";
	char grade = 'A'; //한글자 할 땐 배열 크기 지정 안해도 크게 상관없음.
	
	if (avg >= 90){
		//strcpy(grade,"A");
		grade='A';
	}else if(avg >= 80){
		//strcpy(grade,"B");
		grade='B';
	}else if(avg >= 70){
		//strcpy(grade,"C");
		grade='C';
	}else if(avg >= 60){
		//strcy(grade,"D");
		grade='D';
	}else {
		//strcpy(grade,"F");
		grade='F';
	}
	
	//printf("total: %d avg: %.2f grade: %s\n",total,avg,grade);
	printf("total: %d avg: %.2f grade: %c\n",total,avg,grade);
	
	
	return 0;
}

 


 

 

# variable - 변수

//전역(global)변수 : 함수 밖에 작성, 파일 내에서 함수에 상관없이 자유롭게 사용가능하다.

 - int su = 100; //파일 내에서만 유효
 - static int su2 = 44; //static 효과가 다른 파일에서도 유효(프로그램이 실행 중일 때)

//지역(local)변수 : 함수 안에 작성, 블록 내에서 정의된 내용은 반영되지 않는다.

 - const int su3 = 88; //1회 초기화 이후 변경 불가 (읽기 전용)

 - auto int su = 333; //auto - 로컬변수 지정, 블록 내에서 아무것도 안적으면 auto가 작성된 것과 같다. 

//기타 변수
 - register int total = 100; //register : 변수를 메모리가 아닌 CPU에 할당하여 성능 향상을 유도할 수 있다.
 - volatile int total2 = 200;//volatile : 컴파일 최적화 과정을 제외하는 변수로 지정하여 성능향상을 유도할 수 있다.

  * iot센싱 할 때, 오작동 방지에 활용 가능하다.

 

--예문 코드 보기--

더보기
#include <stdio.h>

//전역변수 : 소스코드 내에서 함수에 상관없이 자유롭게 사용가능
int su = 100; //파일 내에서만 유효
static int su2 = 44; //다른 곳에서도 유효(함수를 불러 왔을 때)
const int su3 = 88; //1회 초기화 이후 변경 불가 (읽기 전용)


int main(int argc, char **argv)
{
	printf("variable...\n");
	
	printf("su: %d\n",su);
	su = 200; //값 변경
	printf("su: %d\n",su);
	
	printf("static su2: %d\n",su2);
	
	
    
	//지역변수
	static int num = 99;
	printf("static num : %d\n",num);
	
	
	if(1){ // "1"은 true를 의미한다.
		//auto int su = 333; //auto - 로컬변수 지정
		int su = 333; // 로컬 변수 정의 하지 않아도 동일 결과가 나옴
		printf("if{}>>su: %d\n",su);
	}
    
	printf("su: %d\n",su);//블록 내에서 정의된 내용은 반영되지 않는다. >> su:200
	
	//su3 = 88; //const int >> read-only error
	printf("su3: %d\n",su3);
	
    
    
	register int total = 100; //register : 변수를 메모리가 아닌 CPU에 할당하여 성능 향상유도.
	printf("register total:%d\n",total);
	
	volatile int total2 = 200;//volatile : memory speed up
	printf("volatile total2: %d\n",total2);
	
	
	
	return 0;
}