본문 바로가기
반응형

C언어129

[C언어] 논리연산자 논리연산자는 논리연산을 수행합니다. 논리연산은 부울연산이라고도 부르는데 참,거짓 두개의 값을 이용한 연산입니다. C언어에서는 True, False라는 부울 자료형이 없기 때문에 참은 1, 거짓은 0을 사용합니다. C언어에서 1뿐만 아니라 0이 아닌 모든 값은 참입니다. 논리연산은 세가지가 있습니다. 아래 표를 통해 알아봅시다. 2022. 8. 11.
[C언어] 비교연산자 C언어의 비교연산자는 두 값의 크기를 비교합니다. 비교 결과가 참일 때는 1을, 거짓일 때는 0을 반환합니다. 아래 표로 확인해봅시다. 2022. 8. 11.
[C언어] 증감 연산자 (전위연산, 후위연산) C언어 에서 증감연산자는 1씩 증가시키거나 1씩 감소시키는 연산자입니다. a++ 는 a=a+1 과 같습니다. a-- 는 a=a-1과 같습니다. 전위형과 후위형으로 나뉩니다. 전위형은 증감연산을 먼저 하고 해당 연산이 포함된 코드를 실행합니다. 반면 후위형은 해당 연산이 포함된 코드를 먼저 실행하고 증감연산을 수행합니다. 아래 표를 통해 차이를 알아봅시다. 2022. 8. 11.
C++과 파이썬의 차이 C,자바,C++ 같은 언어를 컴파일 방식 언어라고 합니다. 소스코드를 실행파일로 컴파일 한 뒤, 실행파일을 컴퓨터가 읽습니다. 반면 파이썬, R 과 같은 언어를 인터프리터방식 언어라고 합니다. 인터프리터 방식 언어는 컴파일 과정이 없습니다. 인터프리터가 실시간으로 소스코드를 기계어로 해석하여 실행합니다. 2022. 8. 8.
[C언어] for문 중괄호 생략 for 문 내용이 한줄일 경우 중괄호 생략이 가능합니다. #include int main() { for (int i=1; i 2022. 8. 8.
[C++] 인라인 함수와 일반함수는 무엇이 다른가 인라인함수의 동작은 매크로함수와 같기 때문에 먼저 매크로 함수와 일반함수의 차이를 간단히 설명하겠습니다. 매크로함수 vs 일반함수 C++로 코딩을 하고 실행파일을 만든는 과정을 생각해봅시다. 아래와 같은 단계를 거쳐서 실행파일인 exe 파일이 만들어집니다. 코드 → 선행처리기 → 컴파일러 → 링커 → 실행파일 선행처리기에서 하는 일은 매크로를 치환하는 것입니다. #define A 5 라고 선언되어 있다면 코드 안의 A들을 5로 치환하는 일을 선행처리기가 합니다. 매크로 함수도 선행처리기에서 치환됩니다. 따라서 선행처리기를 거치고 나면 매크로함수는 더이상 없습니다. 매크로로 정의된 수식이 이미 코드에 몸체로 삽입되어 있습니다. 반면 일반함수는 프로그램을 실행한 뒤에도, 해당 함수를 사용할 때마다 호출을 해.. 2022. 7. 28.
[C언어] 난수 생성 rand 함수 (구간 설정 방법) 아래는 이번 글에서 다루는 내용입니다. 랜덤함수 (rand) 난수 바뀌게 하기 (seed) 난수 자동으로 바뀌게 하기 (time) 난수 구간 설정 랜덤함수 (rand) rand 함수는 난수를 생성하는 함수입니다. 0부터 RAND_MAX 사이의 난수를 생성합니다. RAND_MAX 는 컴퓨터 상황에 따라 다릅니다. rand 함수를 사용하려면 stdlib 헤더를 가져와야 합니다. 헤더를 정의하고 rand 함수를 사용해 봅시다. #include #include int main() { printf("%d \n",rand()); printf("%d \n",rand()); printf("%d \n",rand()); } 실행결과는 아래와 같습니다. 코드를 다시 실행해봅시다. 결과가 같습니다. 난수라면 매번 결과가 달라.. 2022. 7. 28.
[C언어] #if, #ifdef, #ifndef 매크로 1. #if 매크로 #if 값 문장 #endif 값이 0이 아닐 경우 문장 실행 #include int main() { #if 3 printf("hi"); #endif return 0; } 2. #ifdef 매크로 #ifdef 매크로이름 문장 #endif 매크로 이름이 #define 되었을 경우 문장 실행 #include int main() { #define A #ifdef A printf("hi"); #endif return 0; } 3. #ifndef 매크로 #ifndef 매크로이름 문장 #endif 매크로 이름이 #define 되지 않았을 경우 문장 실행 #include int main() { #define B #ifndef A printf("hi"); #endif return 0; } 2022. 7. 28.
[C언어] #define 매크로에서 괄호가 중요한 이유 아래와 같이 매크로를 정의했다고 합시다. #define SUM(X,Y) X+Y 아래 출력결과는 무엇일까요? SUM(1,3)*5; 1+3*5 이므로 16입니다. 만약 (1+3)*5 를 의도했다면 아래와 같이 매크로를 정의해야 합니다. #define SUM(X,Y) (X+Y) 2022. 7. 28.
[C언어] #define 이란 무엇인가 (왜 매크로라고 부르나) #define 은 크게 두가지 기능이 있습니다. 상수와 함수입니다. 1. 상수 (단순매크로) 어떤 값을 반복적으로 사용해야 하는 경우 변수로 선언하여 사용할 수 있습니다. 예를 들어 원주율이 있습니다. 아래와 같이 변수로 선언하여 이후에는 변수로 사용하면 됩니다. int PI=3.14; 하지만 이와 같이 선언할 경우 실수로 값을 변경할 수 있는 위험이 있습니다. 이런 경우 두 가지 대안이 있는데요. const 를 이용하여 상수로 만들거나 #define 을 이용하는 방법입니다. 먼저 const를 사용해봅시다. const int PI=3.14; 위와 같이 코딩할 경우 PI 는 변하지 않습니다. 또는 #define 을 사용하여 아래와 같이 코딩할 수도 있습니다. #define PI=3.14; const 상수와.. 2022. 7. 27.
[C언어] #include 란 무엇인가 #include 는 파일의 내용을 불러와 해당 줄에 붙여넣는 기능을 합니다. 코드가 길어질 경우 코드 일부를 .c 파일에 저장하고 원하는 위치에 #include 를 이용하여 붙여넣어줄 수 있습니다. 아래와 같이 사용합니다. #include "파일경로\파일이름.c" 백슬레쉬는 한번만 사용합니다. 헤더파일을 선언할 때 꺾쇠괄호를 사용하는 것을 보신 적이 있을겁니다. 아래와 같습니다. #include 꺾쇠괄호는 컴파일러가 설정한 특정 디렉터리(include디렉터리)에서 파일을 찾습니다. 큰따옴표는 소스파일이 저장된 디렉터리에서 파일을 찾습니다. 2022. 7. 27.
[C언어] 파일 입출력에서 fopen, fclose 함수의 이름 뜻과 사용 이름 뜻 fopen 하면 파일을 여는(읽는) 함수라고 생각하기 쉽습니다. fopen 이라는 이름 때문에 file 을 open 한다고 생각하기 때문인 것 같습니다. fopen 함수는 파일을 읽을 때도 사용되고 파일에 쓸 때도 사용됩니다. fopen 함수의 이름과 의미를 연결하려면 open 을 잘 해석해야 합니다. fopen 에서 open은 파일을 '개방'상태로 만든다는 뜻입니다. 다른 말로 '스트림을 형성한다'고 표현 할 수도 있습니다. 반대로 fclose 는 개방상태를 종료한다는 의미입니다. '스트림을 해재한다'와 같은 말입니다. 파일 읽기 fopen 함수를 이용하여 data.txt 라는 파일을 '읽기' 상태로 만들면 아래와 같습니다. FILE * fp =fopen("파일경로\\data.txt", "r".. 2022. 7. 25.
[C언어] 동적 할당이란 무엇인가 (malloc, free) 동적 할당은 프로그램 실행 중에 메모리 공간을 할당하는 것을 말합니다. 동적 할당은 전역변수와 지역변수로는 해결되지 않는 상황에 사용합니다. 함수 내 지역변수 처럼 함수가 호출될 때 할당되며, 함수를 빠져나가도 전역변수처럼 유지되는 유형의 변수를 선언하는 것입니다. 이와 같은 변수는 malloc 함수를 통해 할당하고, free 함수를 통해 소멸시킵니다. malloc 함수는 아래와 같이 사용합니다. int 형으로 선언한 경우의 예시입니다. int *p1= (int *) malloc(sizeof(int)); malloc 함수의 반환형은 void이기 때문에 형변환을 해주어야 합니다. (int *) 명령어를 이용하여 int형 포인터로 형변환을 하였습니다. 함수 인자에는 바이트 크기를 넣어주면 됩니다. sizeo.. 2022. 7. 25.
[C언어] 전역변수에 대한 흔한 오해 많은 분들이 main 함수 안에 선언한 변수를 전역변수로 착각하십니다. main 함수도 엄연한 함수이며 main 함수 안에 선언된 변수는 지역변수입니다. 전역변수는 아래와 같이 어떤 함수와도 무관한 곳에 정의됩니다. #include int var; int main() { } 2022. 7. 22.
[C언어] 문자열을 비교하여 순서를 알려주는 함수 (strcmp) 아래와 같은 두개의 문자열 배열이 있다고 합시다. char s1[30]="apple"; char s2[30]="bpple"; 두 문자열의 사전 순서를 알고 싶습니다. 이런 경우 strcmp 함수를 사용하면 됩니다. strcmp 함수는 string.h 헤더를 include 해줘야 사용할 수 있습니다. strcmp 함수는 아래와 같은 형식으로 사용합니다. strcmp(s1,s2) s1이 s2보다 사전에서 앞에 나올 경우 -1을, 뒤에 나올 경우 1을, 같을 경우 0을 반환합니다. apple이 bpple 보다 사전 순서로 앞이므로 -1이 반환될 것입니다. 주의할 점은 아스키코드를 비교하는 것이라는 것입니다. 대문자와 소문자 비교시 대문자가 소문자보다 순서상 앞에 있습니다. 아래 코드를 통해 확인해봅시다. #i.. 2022. 7. 22.
[C언어] 문자열 길이 계산 (strlen) 아래와 같은 문자열 배열이 있다고 합시다. char my_str[30]="hello world" 위 문자열의 길이를 알고 싶다면 strlen 함수를 사용하면 됩니다. strlen 함수는 string.h 헤더를 include 해줘야 사용할 수 있습니다. strncat 함수는 아래와 같은 형식으로 사용합니다. strncat(my_str) my_str 이라는 문자열의 길이를 반환합니다. 아래 코드를 통해 확인해봅시다. #include #include int main() { char my_str[30]="hello world"; int len; len=strlen(my_str); printf("%d",len); } 2022. 7. 22.
[C언어] 문자열 뒤에 원하는 문자열 이어붙이기 (strncat) 아래와 같은 문자열 배열이 있다고 합시다. char my_str[30]="hello" 이 문장뒤에 " world" 에서 " wo" 까지만 붙이고 싶다면 strncat 함수를 사용하면 됩니다. strncat 함수는 string.h 헤더를 include 해줘야 사용할 수 있습니다. strncat 함수는 아래와 같은 형식으로 사용합니다. strncat(my_str," world",3) my_str 이라는 문자열 뒤에 " world" 라는 문자열에서 문자 3개만 이어붙이겠다는 의미입니다. 아래 코드를 통해 확인해봅시다. 배열의 길이는 넉넉히 설정해주어야 합니다. #include #include int main() { char my_str[30]="hello"; strncat(my_str," world",3); .. 2022. 7. 22.
[C언어] 문자열 뒤에 원하는 문자열 이어붙이기 (strcat) 아래와 같은 문자열 배열이 있다고 합시다. char my_str[30]="hello"; 이 문장뒤에 " world"를 붙이고 싶다면 strcat 함수를 사용하면 됩니다. strcat 함수는 string.h 헤더를 include 해줘야 사용할 수 있습니다. strcat 함수는 아래와 같은 형식으로 사용합니다. strcat(my_str," world") my_str 이라는 문자열 뒤에 " world" 라는 문자열을 이어붙이겠다는 뜻입니다. 아래 코드를 통해 확인해봅시다. 배열의 길이는 넉넉히 설정해주어야 합니다. #include #include int main() { char my_str[30]="hello"; strcat(my_str," world"); printf("%s",my_str); } 2022. 7. 22.
[C언어] 문자열에서 원하는 개수 복사 (strncpy) 아래와 같은 문자열이 있다고 합시다. "hello world" 이 문장에서 hello 만 복사해 오고 싶다면 strncpy 함수를 사용하면 됩니다. strncpy 함수는 string.h 헤더를 include 해줘야 사용할 수 있습니다. strncpy 함수는 아래와 같은 형식으로 사용합니다. strncpy(my_str,"hello world",5) "hello world" 라는 문장에서 5개 문자를 my_str 이라는 배열에 복사하겠다 라는 뜻입니다. 위 코드가 실행되면 my_str 이라는 배열에 "hello"가 입력됩니다. 당연히 먼저 my_str 이라는 배열을 정의해주어야 합니다. 아래 코드를 통해 확인해봅시다. #include #include int main() { char my_str[6]; str.. 2022. 7. 22.
[C언어] scanf 와 getchar 의 차이 scanf 는 숫자와 문자를 입력받을 수 있습니다. getchar 은 문자만 입력받을 수 있습니다. scanf 는 매개변수가 필요한 함수입니다. 아래와 같이 사용합니다. int var; scanf("%d",&var); 반면 getchar 은 매개변수가 필요 없습니다. 아래와 같이 사용합니다. int var; var=getchar(); 2022. 7. 21.
[C언어] 컴퓨터가 문자를 나타내는 방법 (아스키 코드) c언어에서 문자를 입력하면 정수로 저장됩니다. 우리가 볼 때는 문자와 정수의 차이가 있지만 컴퓨터가 인식하기에는 똑같습니다. C언어가 문자를 나타내는 방식은 각 문자를 정수에 대응시켜 사용하는 것입니다. 이렇게 대응시켜놓은 규칙이 아스키코드입니다. 아래는 몇가지 예시입니다. 97 a 98 b 99 c 100 d 우리가 C언어에 a라고 입력하면, C언어는 97이라는 정수로 받아들입니다. 그렇다면 정수와 문자를 어떻게 구분할까요? 서식문자로 구분합니다. %c 들어보셨죠? a를 선언하고 출력해봅시다. #include int main() { char c1='a'; printf("%d \n",c1); printf("%c \n",c1); } 정수로 출력하면 97이 출력되고, 문자로 출력하면 a가 출력됩니다. 2022. 7. 21.
[C언어] 자료형이 달라도 포인터의 크기는 같다 포인터는 주소를 저장합니다. 모든 주소는 크기가 같기 때문에 포인터도 크기가 같습니다. 정의 시 자료형은 참조하는 변수의 자료형을 따르지만, 포인터의 크기와는 무관합니다. char, int, double 변수를 참조한 포인터를 정의하고 크기를 확인해봅시다. #include int main() { char a; int b; double c; char *pa=&a; int *pb=&b; double *pc=&c; printf("*pa 의 크기 : %d \n",sizeof(pa)); printf("*pb 의 크기 : %d \n",sizeof(pb)); printf("*pc 의 크기 : %d \n",sizeof(pc)); } 2022. 7. 15.
[C언어] const 와 포인터 아래와 같이 포인터 변수 앞에 const 를 붙이면 어떤 일이 벌어질까요? int a=5; const int *pa=&a; *pa 를 이용하여 a 값을 바꿀 수 없게 됩니다. 아래와 같이 입력할 경우 오류가 발생합니다. *pa=3; 2022. 7. 15.
[C언어] 변수를 그냥 수정하는 것과 포인터로 수정하는 것의 차이 변수와 해당 변수의 주소를 가리키는 포인터를 하나 선언합시다. int a=3; int *pa=&a; 변수의 값은 아래와 같이 두가지 방법으로 수정할 수 있습니다. a=5 *pa=5 차이가 뭘까요? a=5 로 선언할 경우, 만약 다른 함수 안에서 해당 코들르 선언했다면 다른 함수 안에 있는 변수 a가 5로 수정됩니다. 포인터를 사용할 경우 어디에 선언하는지와 상관 없이 우리가 원하는 a를 5로 수정할 수 있습니다. 2022. 7. 15.
[C언어] 배열에 문자를 하나씩 입력하는 경우 (널문자의 중요성) 배열을 하나 정의하고 문자를 하나씩 입력해봅시다. #include int main() { char str[10]; str[0]='A'; str[1]='B'; printf("%s",str); return 0; } 쓰레기 값이 출력됩니다. 널 문자를 이용하여 AB만 출력되도록 해봅시다. 문자열은 널 문자 까지만 출력됩니다. 널 문자는 \0 입니다. #include int main() { char str[10]; str[0]='A'; str[1]='B'; str[2]='\0'; printf("%s",str); return 0; } 2022. 7. 15.
[C언어] scanf 의 한계와 gets 함수 (빈칸 포함 문장 입력) scanf 는 문자열을 입력받는 함수입니다. scanf 함수의 한계는 빈칸 전까지만 입력이 가능하다는 것입니다. 스페이스를 누르는 순간 입력이 종료됩니다. 빈칸을 포함한 문장을 입력받으려면 어떻게 해야 할까요? 이럴때 사용하는 함수가 gets 함수입니다. gets 함수를 이용하여 빈칸이 포함된 문자열을 입력받아봅시다. #include int main() { printf("문장을 입력하세요"); char str[30]; gets(str); printf("%s",str); return 0; } 2022. 7. 14.
[C언어] 문자열 변수 변경하는 방법 (strcpy) 숫자형 변수는 아래와 같이 다른 값을 대입하여 변수에 입력된 값을 변경할 수 있습니다. #include int main() { int num=5; printf("%d \n",num); num=10; printf("%d",num); return 0; } 반면 문자열은 아래와 같이 변경을 시도할 경우 오류가 발생합니다. #include int main() { char str[10]="hi"; printf("%s \n",str); str[10]="hello"; printf("%s",str); return 0; } 이때는 strcpy 함수를 사용합니다. 위 예시를 아래와 같이 변형하면 됩니다. strcpy 함수를 사용하려면 string.h 를 include 해야합니다. #include #include int m.. 2022. 7. 14.
[C 언어] 복합대입연산자 괄호 안이 수행되는 연산입니다. a+=b (a=a+b) a-=b (a=a-b) a*=b (a=a*b) a/=b (a=a/b) a%=b (a=a%b) 2022. 7. 13.
[C언어] 자료형 한눈에보기 대표적으로 사용하는 자료형입니다. long double 형의 길이는 컴파일러마다 다릅니다. 2022. 7. 8.
[C언어] 자료형의 크기를 확인하는 방법 sizeof 함수를 사용합니다. 다양한 자료형의 크기를 출력해보겠습니다. #include int main () { char a; short b; int c; long d; long long e; printf("char: %ld \n",sizeof(a)); printf("short: %ld \n",sizeof(b)); printf("int: %ld \n",sizeof(c)); printf("long: %ld \n",sizeof(d)); printf("long long: %ld \n",sizeof(e)); } 아래는 출력결과입니다. 2022. 7. 8.
반응형