본문 바로가기

C언어

[몰랐던 사실] fgets의 비밀 fgets의 비밀 fgets는 개행문자를 무시하고 문자열을 입력 받을 수 있는데 마지막에 개행문자 '\n' 도 같이 포함이 되게 된다. 그렇기 때문에 이를 제거하려면 아래와 같이 제거해주면 된다. 고로 문자열의 길이 또한 \n이 붙어있기 때문에 "hello" 라는 문자열을 입력했을 때 5가 아닌 6이 나올 것이다. 주의해서 사용하자! str[strlen(str) - 1] = '\0' fgets와 scanf를 함께 사용할 때에는 '\n'를 생각해줘야한다. Scanf는 \n 을 저장하지 않기 때문에 buffer에 그대로 남아있는데 반복문을 사용 할 때 fgets 와 scanf를 섞어 사용하면 scanf에서 읽지 않은 개행문자가 fgets에 자동으로 들어가서 원치 않는 상황이 발생할 수 있다. 이럴 때에는 g.. 더보기
[C언어 몰랐던 사실] scanf로 공백까지 읽어버리기! Scanf로 공백까지 읽을 수 있다..! " ^/n " 과 같은 지정자를 포함하면 된다..! scanf("%[^\n]s",string); 더보기
C언어 0.09 - 문자열 배열과 포인터 배열 문자열 배열과 포인터 배열의 차이점 아래의 수식이 왜? 불가능할까? &ar, ar 을 출력해보면 아마도 같은 값이 나오는 것을 볼 수 있을 것이다. 어찌보면 이 둘은 같아보이지만 틀리다. ar 은 포인터 상수로 정확한 타입은 int* const 이다. &ar은 크기가 5인 정수형 배열이며 타입은 int(*)[5] const 이다. int ar[5] = {1,2,3,4,5}; int *pi; pi = ar; // 가능 pi = &ar; // 불가능 고로 &ar 은 배열 전체에 대한 주소이기 때문에 pi 포인터 상수에 대입하려고 할 때 오류가 나는 것이다. 해결 방법은 아래와 같이 수정해야 대입을 할 수 있다. int (*pi)[5]; pi = &ar; 여기서 (*pi)[5] 와 *pi[5] 는 굉장히 다르.. 더보기
C 언어 0.05 - 포인터 ( pointer ) Pointer 란? 쉽게 말해서 메모리 상에 위치한 특정한 데이터의 주소값을 보관하는 변수이다. 포인터는 하나의 타입으로 32 비트 : 4 byte 64 비트 : 8 byte 를 차지한다. int *p = &a; 이중 Pointer #include int main() { int *numPtr1; // 단일 포인터 선언 int **numPtr2; // 이중 포인터 선언 int num1 = 10; numPtr1 = &num1; // num1의 메모리 주소 저장 numPtr2 = &numPtr1; // numPtr1의 메모리 주소 저장 printf("%d\n", **numPtr2); // 20: 포인터를 두 번 역참조하여 num1의 메모리 주소에 접근 return 0; } 포인터도 실제로는 변수이기 때문에 메.. 더보기
C 언어 0.04 - 배열 ( array ) 배열의 기초 /* 배열 기초 */ #include int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int arr[] = {1,2,3,4,5} // 크기가 5인 배열 printf("Array 3 번째 원소 : %d \n ", arr[2]); return 0; } 배열은 말 그대로 특정한 형의 변수들의 집합이다. 배열의 선언은 다음과 같다. ( 배열의 타입 ) ( 배열의 이름 ) [원소 개수] ; 다음과 같은 코드가 있을 때 컴파일러는 내부적으로 int arr[3] = {1,0,0} 이라고 생각한다. int arr[3] = {1}; 고차원 배열 /* 2 차원 배열 */ #include int main() { int arr[3][3] = {1, 2, .. 더보기
C 언어 0.03 - 문자열 ( string ) 선언 ( Declare ) 아래와 같이 선언해주면 된다. 유의할 점 %s 사용할 것 string 타입은 문자열의 끝을 컴퓨터에게 알려주기 위해서 ' \0 ' 을 반드시 넣기 때문에 문자열의 길이 + 1 을 반드시 해줘야한다. 원하는 배열의 크기 + 1 반드시 해줘야 한다~ Null 의 아스키코드는 0 이다. 문자 '0' 의 아스키코드는 48 /* 문자열의 시작 */ #include int main() { char sentence_1[4] = {'P', 's', 'i', '\0'}; char sentence_2[4] = {'P', 's', 'i', 0}; char sentence_3[4] = {'P', 's', 'i', (char)NULL}; char sentence_4[4] = {"Psi"}; char .. 더보기
[INTRO] - 왜 C언어를 알아야 할까? 왜 Why? 우선 필자는 C ++ , JAVA 를 사랑해 C 언어 같이 무식한 언어를 뭐하러 알아야 하냐? 라는 마인드를 지니고 있었다. 하지만 전공 공부를 하면서 시스템 프로그래밍의 기본이 되는 C 언어의 중요성에 대해서 깨달아 갔고 이번 기회에 내가 공부하고 알고 있는 C 에 대한 내용들을 블로그를 통해서 남기려고 한다. 지금의 기록이 나의 발전에 도움이 될 수 있도록..! 배운 것을 절대로 까먹고 싶지 않아..!!!!!!! C 언어의 발자취 C 언어는 무려 50년 전에 출시된 언어이다. 그 때부터 지금까지 컴퓨터의 비약적인 성장이 있었고, 마찬가지로 기존 언어들을 대체하는 많은 언어들이 쏟아져 나왔습니다. 그래서 파이썬과 같은 언어들과 비교해서 조금 하드한 부분이 있습니다. 하지만 그럼에도 불구하고.. 더보기