본문 바로가기

C 언어

(26)
예제로 보는 strtok 함수의 기능과 동작 원리 아래 예제 코드는 문자열 myString에서 "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return 하는 solution 함수이다. 해당 코드에서 나는 strtok 함수를 사용했는데, 함수 사용이 익숙하지 않고 동작방식을 몰라 정리해서 기록하기로 하였다.특히, 문자를 자르는 함수라는건 알겠는데, 이 함수가 어떻게 구분자가 여러개 있으면 여러번 문자를 자를 수 있는지 이해가 잘 가지 않았다. 나를 포함해 strtok의 사용법이 익숙하지 않은 이들을 위해 strtok의 기능과 동작 방식을 설명해보겠다. #include #include #include #include // 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.char..
모듈러 연산으로 큰 숫자 계산하기 보호되어 있는 글입니다.
c언어 : 예제로 보는 포인터와 배열의 관계 프로그래머스 문제 (왼쪽 오른쪽)문제 문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있습니다. str_list에서 "l"과 "r" 중 먼저 나오는 문자열이 "l"이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를, 먼저 나오는 문자열이 "r"이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요. "l"이나 "r"이 없다면 빈 리스트를 return합니다.제한사항1 ≤ str_list의 길이 ≤ 20str_list는 "u", "d", "l", "r" 네 개의 문자열로 이루어져 있습니다.입출력 예str_list result[..
C 언어: scanf 사용 시 입력 버퍼 비우는 방법 프로그래밍에서 버퍼는 상대적으로 느린 입출력 장치의 속도를 보완하고자 임시기억공간인 버퍼를 만들어서 데이터를 저장하고 한번에 전달하는 역할을 한다. 비유하자면 마치 마트에서 물건을 하나씩 가져가서 계산하는 것보다 버퍼라는 카트에 필요한 물건들을 한번에 담고 계산대로 이동하는 것과 같다.  여기서 scanf 함수는 버퍼를 이용해서 사용자에게 데이터를 입력 받는 함수이다. 이 함수를 사용해서 데이터를 입력하면 데이터는 입력 버퍼에 임시저장되었다가, 그 데이터를 scanf가 즉시 처리하여 변수에 할당한다.  해당 원리를 염두하고, scanf 함수로 세 개의 문자를 입력받고 출력하는 예제 코드문을 읽어보자.  c1 = 'a'c2 = 'b'c3 = 'c' 를 입력하는 것이 목표이다. #include #pragma..
반복문 종료 조건 (논리 연산자 &&와 ||의 차이) while 반복문을 가지고 어떤 문자를 반복해서 입력한다고 가정하자.사용자가 계속 문자를 입력하다가 while문을 종료하고 싶으면 'Q', 'q' 를 입력하면 프로그램이 종료하도록 구현하고 싶다.그렇다면, 두 코드 중 어떤 코드가 올바르게 작동할까? 몇번인지 맞춰보도록 하자. //1번while (isExit != 'q' && isExit != 'Q') { printf("문자 입력 ('Q', 'q' 입력 시 종료): "); isExit = getchar(); // 사용자로부터 문자 입력 받기 num++; } //2번while (isExit != 'q' || isExit != 'Q') { printf("문자 입력 ('Q', 'q' 입력..
C언어_2차원 배열과 포인터의 관계(2) 앞서 설명했듯이, 배열의 이름은 1차원, 2차원, 3차원 배열에 상관없이 배열의 시작 주소를 나타낸다. 여기에서  추가로 알아야 할 점은 다음과 같다. 1차원 배열에서는 배열 이름 뒤에 첨자를 사용하면, 해당 첨자의 배열 요소를 가리킨다. 2차원 배열에서는 배열 이름 뒤에 행 첨자를 사용하면, 해당 행의 시작 주소를 가리킨다.예시를 위해, 2차원 배열 b가 있다고 가정해보자. int b[4][3]; b[0] 은 0행의 시작 주소,b[1] 은 1행의 시작 주소, b[2] 는 2행의 시작주소를 가리킨다.  그리고  2차원 배열의 각 원소에 접근하기 위해서는 인덱스가 2개씩 붙어야 한다.( b[0][0], b[0][1], b[1][0], b[1][1]...). 이제 배열 이름의 증감에 따른 변화를 살펴보도록 ..
c언어_2차원 배열과 포인터의 관계(1) 2차원 배열에서는 포인터의 역할이 더 복잡해진다.2차원 배열은 행과 열로 구성되는데, 1차원 배열에서 배열의 이름은 배열의 첫 번째 요소의 주소를 가리켰다면, 2차원의 경우 배열 이름은 첫 번째 행의 첫 번째 요소를 가리킨다. 자세한 설명을 위해, 2차원 배열 a, b 가  있다고 가정하자. int a[3][2];int b[4][3]; 배열의 이름은 1차원이든 2차원이든 무조건 그 배열의 시작 주소이다.즉, a,b 라는 배열의 이름은 그 배열의 시작 주소를 나타내는 포인터이다.  1차원 배열에서, 배열의 이름을 1씩 증가할 때,int형이면 4바이트씩 증가하고,double이면 8바이트씩 증가하고,char면 1바이트씩 증가한다. 자, 그러면 2차원 배열의 포인터도 int 타입이니까 무조건 4바이트씩 증가할까..
c언어 포인터와 1차원 배열의 관계 포인터와 배열은 C 언어에서 매우 중요한 개념으로, 특히 배열과 포인터의 관계는 많은 이들에게 혼란을 줄 수 있다. 이 글에서는 포인터의 기본 개념부터 1차원 배열과의 관계까지 쉽게 설명해보겠다.포인터의 기본 개념포인터는 두 가지만 기억하면, 별(*)이 아무리 많이 붙어도 헷갈리지 않을 수 있다. 첫 번쨰, 포인터는 간단히 말해 "주소를 저장하는 변수"다.포인터와 일반 변수의 차이가 뭘까? int main(void){ int a; int* p; } 위 코드에서 a라는 변수는 int형 정수 값을 저장한다.즉 a는 4byte 크기의 정수 값을 저장한다.반면, p라는 포인터는 8byte의 메모리 블록에 어떤 변수의 주소값을 저장하는데, 포인터가 저장하는 주소는 메모리에서 특정 변수가 저장된 위치의 첫 번째..