c 16

입출력, 매크로, wsl

다양한 형태로 입출력 하는 함수 a.txt에는 이름1 70 80 90이름2 40 50 60이름3 100 20 30 이런식으로 텍스트가 들어있다. a.txt 에서 이름(문자열)과 세 개의 점수(정수)를 순서대로 읽어온 뒤 세 점수의 총점과 평균을 계산한 후 b.txt 파일에 이름, 총점, 평균을 정해진 형식으로 새로 쓴다. 1. 서식 지정 입출력: fprintf - 각 데이터 사이에 있는 공백/줄바꿈은 자동 무시, fscanf - 데이터를 지정된 형태로 변환하여 출력2. 줄/문자열 단위 입출력: fgets - \n을 문자열 끝에 포함하여 읽고 공백문자를 구분자로 사용하지 않고 오직 줄 끝(\n) 또는 파일의 끝(EOF) 까지 읽는다, fputs - 주어진 문자열을 파일 포인터가 가리키는 파일에 출력한#i..

c 2025.11.17

파일처리

power shell 에서더보기wsl -l -vwsl -d Ubuntu 리눅스더보기ifconfigsudo apt install net-toolsifconfigsudo apt install apache2 ifconfig 후 eth0에 뜨는 ip로 들어가면 아파치가 뜬다 cd /var/logls # apache가 생긴걸 볼 수 있음cd apache2cat access.log # cat access 까지 치고 tab 누르기, 여기에 누가 어떻게 접근했는지 다나온다 파일 열기cd ~/work/basiclscode Ex18-1.cnano ./a.txt # ctrl + S > ctrl + Xcat a.txt#include int main() { FILE* fp; // FILE: typedef struct _I..

c 2025.11.13

배열, 포인터와 구조

2차원 배열과 배열 포인터포인터 변수는 메모리 주소를 값으로 저장한다. 이 주소는 다른 데이터(변수, 배열 등)가 저장된 위치를 가리키는 역할을 한다.int ary[3][4]: 2차원 배열에서 배열의 이름 ary는 첫 번째 행 배열의 주소를 나타낸다. 즉 ary의 타입은 "int 4개 짜리 배열을 가리키는 포인터" 이다int (*pa) [4]: 배열 포인터이다. (*pa)에 괄호가 있으면 pa가 포인터임을 먼저 선언한다. pa는 int 4개짜리 배열을 가리키는 포인터이다 (만약 괄호가 없으면 int *pa[4]는 포인터 4개짜리 배열이 된다)#define _CRT_SECURE_NO_WARNINGS#include // 함수 선언: 배열 포인터를 매개변수로 받음void print_ary(int (*pa)[4..

c 2025.11.11

이중포인터 N차원 배열

레지스터 변수레지스터변수는 cpu 내부에 있는 레지스터라는 매우 빠른 기억장치에 변수를 할당하도록 컴파일러에게 요청하는 변수이다레지스터는 메인 메모리(RAM)보다 훨씬 빠르게 CPU가 접근할 수 있어 변수를 레지스터에 저장하면 연산 속도를 높일 수 있다하지만 레지스터는 메모리가 아니므로 고유한 메모리 주소를 가지지 않고 & 연산자를 사용해 레지스터 변수의 주소를 얻을 수 없다#include int main(void) { register int i; int sum = 0; for (i = 0; i CPU 연산 장치, 레지스터, 메인 메모리 관계도요소위치속도용량용도레지스터CPU 내부매우 빠름매우 작음 (몇 바이트)현재 CPU가 연산에 사용할 임시 데이터 저장메인 메모리 (RAM)CPU 외부느..

c 2025.11.10

문자열

1. 화이트 스페이스는 화면에 보이지 않지만 공간을 차지하는 문자들인데, scanf 는 화이트 스페이스를 구분하지 않고 그냥 다음 문자를 읽어버려 전부 다 문자로 취급해버린다. 따라서 다음과 같이 해결할 수 있다. 1. 공백 추가: scanf(" %c", &ch);2. 버퍼 비우기: getchar()#define _CRT_SECURE_NO_WARNINGS#include int main() { char ch1, ch2; // 화이트 스페이스 에러 // scanf("%c%c", &ch1, &ch2); // 공백을 사용해 해결 scanf(" %c %c", &ch1, &ch2); // fflush(stdin); // Linux/POSIX 에서는 동작 안함 printf("[%c%c]", ch1,..

c 2025.11.07

포인터

1. gets 함수 - gets 함수는 글자를 무제한으로 받기 때문에 fgets를 쓰는게 좋다(배열이 할당된 메모리 공간을 넘어서 다른 메모리 영역을 덮어쓰게 되는 버퍼오버플로우가 발생할 수 있다) 2. 포인터 포인터로 두 정수의 합과 평균을 구하는 코#define _CRT_SECURE_NO_WARNINGS#include int main(void) { // 1. 변수 선언 및 초기화 int a = 10, b = 15, total; // 정수형 변수 선언 및 초기값 할당 double avg; // 실수형 변수 선언 // 2. 포인터 선언 int* pa, * pb; // 정수형 변수를 가리키는 포인터 pa, pb 선언 // 포인터 pt에 total 변수의 ..

c 2025.11.06

배열

1. 배열 선언 후 값 설정ary[4] 를 출력한 결과가 -85.. 인것을 통해 쓰레기 값인걸 확인할 수 있다. 이는 프로그램이 예측할 수 없는 동작을 일으킬 수 있기 때문에 배열 초기화는 필수적이다. 또 코드는 배열 ary[5]의 유효한 첨자 범위인 ary[0]~ary[3]을 사용해서 정상적으로 값을 읽고 쓰는 과정을 보여준다. 유효 범위를 벗어난 첨자(ary[5] 이상)를 사용하면 런타임 오류나 예상치 못한 메모리 손상이 초래될 수 있다. 2. 배열 선언과 동시에 초기화 선언과 동시에 초기화 안된 배열 선언과 동시에 초기화된 배열 선언과 동시에 부분 초기화 3. 배열의 코드 최적화, 리팩토링초기 순차적 방식: 반복문 없이 배열의 각 요소를 하나씩 처리하는 방식이다.반복문을 이용한 최적화 방식: 제공된..

c 2025.11.05

함수와 배열 일부

1. 매개변수가 있는 함수main 스택 프레임을 생성한다. 여기에 지역변수 a, b, result 값이 저장된다.result = sum (a, b); 를 실행하기 전 sum 함수 호출 준비를 한다. cpu는 현재 다음에 실행해야 할 명령어의 주소(sum 함수가 끝난 후 돌아와야 할 result에 값을 대입하는 명령의 주소)를 복귀주소로 스택에 저장한다. sum 함수로 제어가 이동되어 main 프레임 위에 sum 함수를 위한 새로운 스택 프레임이 쌓인다. 전달된 인자(10, 20)은 sum 함수의 매개변수 x와 y에 할당된다. 함수 본체가 실행된 후 x+y의 결과 30이 계산된다.return x + y; 명령이 실행되면 계산된 결과값 30을 반환값으로 레지스터에 저장한다. sum 함수는 스택에 저장했던 복..

c 2025.11.04