LabEx 에서 첫 번째 C 프로그램 만들기

CBeginner
지금 연습하기

소개

이 랩에서는 LabEx VM 에서 첫 번째 C 프로그램을 작성하고 실행하는 방법을 배우게 됩니다. 간단한 "Hello, World!" 프로그램으로 시작하여 여러 print 문을 사용하여 출력을 개선하고, 변수를 사용하여 출력을 개인화하며, C 에서 문자열 조작을 탐구하고, 마지막으로 C 프로그램을 컴파일하고 디버깅하는 방법을 배우게 됩니다.

첫 번째 C 프로그램 작성 및 실행

이 단계에서는 LabEx VM 에서 첫 번째 C 프로그램을 작성하고 실행합니다. C 프로그래밍의 기본 구조를 소개하는 간단한 "Hello, World!" 프로그램을 만드는 과정을 안내해 드리겠습니다.

WebIDE 열기

  1. LabEx 인터페이스에서 "WebIDE" 탭 (기본값) 을 클릭하여 VS Code 와 유사한 환경을 엽니다.
  2. 왼쪽 사이드바 파일 탐색기에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택합니다.
  3. 파일 이름을 hello.c로 지정합니다. .c 확장자는 이것이 C 소스 코드 파일임을 나타냅니다.

WebIDE 인터페이스 스크린샷

WebIDE 에 대해 자세히 알아보려면 WebIDE 가이드를 확인하세요.

첫 번째 C 프로그램 작성

다음 코드를 복사하여 hello.c 파일에 붙여넣습니다.

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

이 코드를 분석해 보겠습니다.

  • #include <stdio.h>: 표준 입출력 라이브러리를 포함합니다.
  • int main() { ... }: 프로그램 실행이 시작되는 main 함수입니다.
  • printf("Hello, World!\n");: 화면에 텍스트를 출력합니다.
  • \n: 출력 후 새 줄로 이동합니다.
  • return 0;: 프로그램이 성공적으로 완료되었음을 나타냅니다.

프로그램 컴파일 및 실행

WebIDE 에서 터미널을 열고 다음 명령을 실행합니다.

gcc hello.c -o hello
./hello

C 프로그램 실행 터미널 스크린샷

예시 출력:

Hello, World!

명령 설명

  • gcc hello.c -o hello: C 소스 코드를 hello라는 실행 파일로 컴파일합니다.
  • ./hello: 컴파일된 프로그램을 실행합니다.

여러 개의 Print 문으로 출력 개선

이 단계에서는 여러 print 문을 추가하여 C 프로그램을 개선하는 방법을 배우게 됩니다. 이를 통해 더 복잡한 출력을 표시하고 프로그램에서 여러 줄의 텍스트를 사용하는 방법을 이해할 수 있습니다.

기존 프로그램 수정

  1. 이전 단계에서 생성한 WebIDE 에서 hello.c 파일을 엽니다.
  2. 파일 내용을 다음 코드로 바꿉니다.
#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    printf("Welcome to C programming!\n");
    printf("This is your first multi-line program.\n");
    return 0;
}

코드 설명

  • 두 개의 printf 문을 더 추가했습니다.
  • printf는 새 줄을 만들기 위해 \n으로 끝납니다.
  • 세미콜론 (;) 은 각 명령의 끝을 표시합니다.

업데이트된 프로그램 컴파일 및 실행

WebIDE 에서 터미널을 열고 다음 명령을 실행합니다.

gcc hello.c -o hello
./hello

예시 출력:

Hello, World!
Welcome to C programming!
This is your first multi-line program.

주요 관찰 사항

  • printf 문은 별도의 줄에 출력됩니다.
  • \n은 출력 사이에 줄 바꿈을 보장합니다.
  • 필요한 만큼 많은 printf 문을 추가할 수 있습니다.

문제 해결 팁:

  • 각 줄이 \n으로 끝나는지 확인합니다.
  • printf 문이 세미콜론으로 끝나는지 확인합니다.
  • 컴파일하기 전에 파일을 저장했는지 확인합니다.

변수를 사용하여 출력 개인화

이 단계에서는 C 에서 변수를 사용하여 보다 동적이고 개인화된 출력을 만드는 방법을 배우게 됩니다. 변수를 사용하면 프로그램 내에서 데이터를 저장하고 조작할 수 있습니다.

변수를 사용하여 새로운 C 프로그램 만들기

  1. WebIDE 를 열고 greeting.c라는 새 파일을 만듭니다. 또는 터미널에서 touch greeting.c를 입력하여 파일을 만들 수 있습니다.
  2. 다음 코드를 greeting.c 파일에 입력합니다.
#include <stdio.h>

int main() {
    char name[] = "LabEx";
    printf("Hello, %s!\n", name);
    printf("Welcome to C programming, %s!\n", name);
    return 0;
}

코드 설명

  • char name[] = "LabEx";: name이라는 문자 배열 (문자열) 변수를 만듭니다.
  • %sprintf에게 문자열을 삽입하도록 지시하는 형식 지정자입니다.
  • 형식 문자열 뒤의 , name은 삽입할 변수를 지정합니다.

프로그램 컴파일 및 실행

WebIDE 에서 터미널을 열고 다음 명령을 실행합니다.

gcc greeting.c -o greeting
./greeting

예시 출력:

Hello, LabEx!
Welcome to C programming, LabEx!

변수 실험

name 변수를 자신의 이름으로 변경해 보세요.

char name[] = "Your Name";

프로그램을 다시 컴파일하고 실행하여 개인화된 출력을 확인하세요.

문제 해결 팁:

  • printf에서 사용하기 전에 변수가 정의되었는지 확인합니다.
  • 컴파일하기 전에 파일을 저장했는지 확인합니다.
  • 변수 이름의 철자가 올바른지 확인합니다.

C 언어 문자열 조작 탐구

이 단계에서는 C 에서 문자열 연결 및 표준 라이브러리의 문자열 관련 함수 사용을 포함한 기본적인 문자열 조작 기술을 배우게 됩니다.

문자열 조작 프로그램 만들기

  1. WebIDE 를 열고 strings.c라는 새 파일을 만듭니다.
  2. 다음 코드를 입력합니다.
#include <stdio.h>
#include <string.h>

int main() {
    char first_name[] = "Lab";
    char last_name[] = "Ex";
    char full_name[20];

    // Concatenate strings
    strcpy(full_name, first_name);
    strcat(full_name, " ");
    strcat(full_name, last_name);

    // Print string length and concatenated name
    printf("First name length: %lu\n", strlen(first_name));
    printf("Last name length: %lu\n", strlen(last_name));
    printf("Full name: %s\n", full_name);

    return 0;
}

코드 설명

  • #include <string.h>: 문자열 조작 함수를 포함합니다.
  • strcpy(): 문자열을 다른 문자열로 복사합니다.
  • strcat(): 두 문자열을 연결 (결합) 합니다.
  • strlen(): 문자열의 길이를 반환합니다.
  • %lu: 부호 없는 long (문자열 길이와 함께 사용) 에 대한 형식 지정자입니다.

프로그램 컴파일 및 실행

WebIDE 에서 터미널을 열고 다음 명령을 실행합니다.

gcc strings.c -o strings
./strings

예시 출력:

First name length: 3
Last name length: 2
Full name: Lab Ex

문자열 조작 기술

시연된 주요 문자열 연산:

  • 문자 배열 만들기
  • strcpy()로 문자열 복사
  • strcat()로 문자열 결합
  • strlen()으로 문자열 길이 찾기

문제 해결 팁:

  • 대상 문자열에 충분한 공간이 있는지 확인합니다.
  • 문자열 함수를 사용하려면 항상 <string.h>를 포함합니다.
  • 오버플로를 방지하기 위해 문자열 버퍼 크기에 주의합니다.

C 프로그램 컴파일 및 디버깅

이 단계에서는 컴파일러 경고 이해, 컴파일 플래그 사용, 기본적인 디버깅 전략을 포함하여 C 프로그램에 대한 필수적인 컴파일 및 디버깅 기술을 배우게 됩니다.

의도적인 오류가 있는 프로그램 만들기

  1. WebIDE 를 열고 debug.c라는 새 파일을 만듭니다.
  2. 의도적인 오류가 있는 다음 코드를 입력합니다.
#include <stdio.h>

int main() {
    int x = 10;
    int y = 0;

    // Intentional division by zero
    int result = x / y;

    printf("Result: %d\n", result);

    // Unused variable
    int z = 5;

    return 0;
}

경고와 함께 컴파일

추가 경고 플래그를 사용하여 프로그램을 컴파일합니다.

gcc -Wall -Wextra debug.c -o debug

컴파일 플래그 설명

  • -Wall: 대부분의 경고 메시지를 활성화합니다.
  • -Wextra: 더욱 자세한 경고를 활성화합니다.

예시 컴파일러 출력:

debug.c: In function ‘main’:
debug.c:13:9: warning: unused variable ‘z’ [-Wunused-variable]
   13 |     int z = 5;
      |         ^

GDB 를 사용하여 디버깅

디버깅 기호와 함께 컴파일합니다.

gcc -g debug.c -o debug

디버깅 시작:

gdb ./debug

GDB 명령어:

  • run: 프로그램 시작
  • break main: main 함수에 중단점 설정
  • print x: 변수 x 의 값 출력
  • next: 다음 줄 실행
  • quit: GDB 종료
(gdb) run
Starting program: /home/labex/project/debug
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGFPE, Arithmetic exception.
0x0000555555555167 in main () at debug.c:8
8           int result = x / y;
(gdb) print x
$1 = 10
(gdb) break main
Breakpoint 1 at 0x555555555155: file debug.c, line 4.
(gdb) next

Program terminated with signal SIGFPE, Arithmetic exception.
The program no longer exists.
(gdb) quit

GDB 는 8 행에서 0 으로 나누는 오류를 보여줍니다. 프로그램은 산술 예외로 인해 충돌합니다.

프로그램 수정

debug.c를 수정하여 나눗셈을 안전하게 처리합니다.

#include <stdio.h>

int main() {
    int x = 10;
    int y = 2;  // Change from 0 to a non-zero value

    if (y != 0) {
        int result = x / y;
        printf("Result: %d\n", result);
    } else {
        printf("Error: Division by zero!\n");
    }

    return 0;
}

다시 컴파일하고 실행합니다.

gcc -Wall -Wextra debug.c -o debug
./debug

출력:

Result: 5

문제 해결 팁:

  • 항상 -Wall -Wextra로 컴파일합니다.
  • 컴파일러 경고에 주의합니다.
  • 복잡한 디버깅 시나리오에는 GDB 를 사용합니다.
  • 잠재적인 런타임 문제를 위해 오류 검사를 추가합니다.

요약

이 랩에서는 첫 번째 C 프로그램을 작성하고 실행하는 방법, 여러 print 문을 사용하여 출력을 개선하는 방법, 변수를 사용하여 출력을 개인화하는 방법, C 에서 문자열 조작을 탐구하는 방법, C 프로그램을 컴파일하고 디버깅하는 방법을 배웠습니다. 라이브러리 포함, main 함수 정의, printf() 를 사용하여 출력 표시, 프로그램 컴파일 및 실행을 포함하여 C 프로그래밍의 기본 구조에 대한 실질적인 경험을 얻었습니다. 또한 여러 print 문 사용, 변수 및 문자열 작업과 같은 보다 고급 개념도 탐구했습니다.