본문 바로가기

전체 글

(109)
두 개의 텍스트 파일 비교하기 두 개의 텍스트 파일이 같은지 다른지를 확인하는 프로그램을 작성해 보자. 단순히 공백문자 하나가 차이를 보여도 두 텍스트 파일은 다른 것으로 판별이 나야 한다. # 실행의 예 /*다음은 실행파일의 이름이 comp.exe 이고, 비교의 대상이 되는 두 파일의 이름이 각각 d1.txt 와 d2.txt인 경우의 실행의 예이다.*/ C:\test>comp d1.txt d2.txt 두 개의 파일은 완전히 일치 합니다. 헤더 파일 포함하기 #define _CRT_SECURE_NO_WARNINGS #include #include #define _CRT_SECURE_NO_WARNINGS scanf_s 등을 사용하고 싶지 않을 때 컴파일러가 보안 관련 경고를 발생시키지 않도록 할 수 있다. #include 표준 입출력 ..
A와 P로 시작하는 단어의 수를 세어서 출력하기 문자열을 저장하고 있는 파일을 열어서 A와 P로 시작하는 단어의 수를 세어서 출력하는 프로그램을 작성해보자. 단 , 모든 단어는 공백문자(스페이스바, \t, \n)에 의해서 구분된다고 가정한다. 실행의 예 실행파일의 이름이 wordcnt.exe. 이고 대상파일의 이름이 text.txt 인 경우의 실행의 예 C:/>wordcnt text.txt A로 시작하는 단어의 수 : 4 P로 시작하는 단어의 수: 3 도전 4의 해결을 위한 가이드 이번 문제의 구현방법은 참으로 다양하다. 그런데 어떠한 방법을 쓰건 공백문자를 기준으로 단어를 뽑아내야 한다. 참고로 fscanf, scanf 함수 모두 공백을 기준으로 문자열을 구분한다. 변수 선언 및 초기화 #include int main(int argc, char *a..
컴퓨터와 대화하기: fgets와 getchar의 이해 fgets란 무엇인가? fgets 함수는 사용자로부터 "문장"을 입력받고 싶을 때 사용된다. 이 함수는 한 번에 여러 문자를 받아들여, 우리가 말하는 것을 한 줄로 기록한다. 이는 마치 우리가 종이에 문장을 쓰듯이, 컴퓨터가 우리의 말을 줄바꿈(엔터 키 입력)까지 기록하는 것과 유사하다. char sentence[100]; printf("문장을 입력하세요: "); fgets(sentence, sizeof(sentence), stdin); 이 코드는 사용자로부터 최대 100자의 문장을 입력받아 sentence 배열에 저장한다. 사용자가 엔터 키를 누르면 입력이 종료되고, 컴퓨터는 그 전까지의 모든 글자를 기억한다. getchar란 무엇인가? 반면, getchar 함수는 사용자로부터 "한 글자"를 입력받고 ..
입력 버퍼 클리어하기: scanf와 fgets를 혼합하여 사용할 때 왜 "청소"가 필요한가? 컴퓨터와 이야기할 때, 우리는 키보드를 사용해서 컴퓨터에게 무엇을 해야 하는지 알려준다. 가끔은 숫자를 입력하라고 하고, 가끔은 글자나 문장을 입력하라고 한다. 이때 컴퓨터는 우리가 누른 키보드의 모든 것을 기억하는데, 그 중에는 엔터 키도 포함된다. 엔터 키는 컴퓨터에게 프로그램을 끝냈다는 신호이다. 문제가 생기는 상황 상상해보자. 당신이 컴퓨터에게 숫자를 입력하고 엔터를 쳤다고 가정하자. 그 다음에 문장을 입력하라고 했는데, 컴퓨터가 너무 빨리 반응해서 아무것도 입력하지 않았는데도 바로 넘어가버린다면 어떨까? 이건 마치 당신이 친구와 말하기도 전에 친구가 네 말을 끊고 넘어가는 것처럼 답답한 상황인 것이다. 이처럼 scanf 함수는 사용자로부터 특정 형식의 데이터를 입력받는 ..
사용자 입력과 데이터 타입: char 배열과 int 변수의 처리 프로그래밍에서 사용자로부터 데이터를 입력받는 것은 흔한 작업이다. 특히, char 배열(문자열)과 int 변수를 사용자로부터 입력받는 방식은 데이터 타입의 특성과 입력 처리 함수의 차이에 기반한다. char 배열과 사용자 입력 char 배열은 문자열을 저장하며, fgets나 scanf 같은 함수로 사용자로부터 입력을 받는다. fgets 함수는 지정된 길이까지 문자열을 안전하게 입력받을 수 있는 방법을 제공한다. 예를 들어, char name[50]; 선언은 49개의 문자와 종결 문자 '\0'를 저장할 수 있는 공간을 확보한다. 이 배열은 컴파일 시간에 크기가 결정되며, 실행 시간에 사용자로부터 입력받는다. char name[50]; fgets(name, sizeof(name), stdin); int 변수..
Chapter 27. 파일의 분할과 헤더파일의 디자인 1. 파일의 분할 수납장이 하나보다는 여러개가 있으면 관련있는 물건을 수납장별로 보관할 수 있는 것처럼 파일도 여러 곳이 용도 별로 저장해두면 효율적으로 사용할 수 있다 .그런데 단순히 파일을 나눠놓기만 하고 컴파일러에게 파일이 나눠져있다는걸 알려주지 않으면 컴파일 오류가 날 것이다. 컴파일러는 파일 단위로 컴파일을 진행하기 때문이다. 이때 필요한 것이 extern 선언이다. extern int num; // 컴파일러야 int num 은 외부 파일에 있어 다른 파일에서 접근 못하게 하려면 static ! 이 변수의 접근범위는 파일 내부로 제한한다는 뜻이다. 2. 둘 이상의 파일을 컴파일하는 방법과 static에 대한 고찰 방법 1 : 이미 만들어진 파일을 프로젝트에 추가 방법 2: 프로젝트에 파일을 추가..
Chapter 26. 매크로와 선행처리기 (Preprocessor) 1. 선행처리기와 매크로 실행파일은 컴파일 이전에 '선행처리' 라는 과정을 거치게 된다.선행 처리 명령문은 # 으로 시작을 하며, 컴파일러로 처리되는게 아니라 선행처리기로 처리되기 때문에 뒤에 세미콜론을 붙이지 않는다. 또한 컴파일러는 선행처리기의 명령을 이해하지 못한다. #include 컴파일 과정을 거치게 되면 소스코드가 운영체제가 이해할 수 있는 바이너리 데이터로 이루어진 오브젝트 파일이 생성된다. 그렇다면 컴파일 이전에 이루어지는 선행처리기에서는 어떤 처리가 이루어지는 걸까? 선행처리의 과정을 거쳐서 생성되는 파일도 그냥 소스코드일 뿐이다. 단지 선행처리 명령문대로 소스코드 일부를 수정하는 단순 치환(substitution) 의 과정을 거칠 뿐이다. 2. 대표적인 선행처리 명령문 #define: ..
#include <string.h> string.h 헤더 파일은 문자열의 생성, 복사, 연결, 비교, 검색 등의 작업을 수행하는 함수를 사용할 때 선언한다. string.h에 정의된 몇 가지 중요한 함수들은 다음과 같다. strcpy()와 strncpy(): 한 문자열을 다른 문자열로 복사 strcat()와 strncat(): 한 문자열의 끝에 다른 문자열을 연결 strcmp()와 strncmp(): 두 문자열을 비교 strlen(): 문자열의 길이를 반환 strchr()와 strrchr(): 문자열 내에서 특정 문자를 검색 strstr(): 하나의 문자열 내에서 다른 문자열의 첫 번째 출현을 검색 strtok(): 문자열을 특정 구분자로 분리 예제로, 두 문자열을 비교하거나 하나의 문자열에 다른 문자열을 복사하는 간단한 작업 코드이다. ..