전체 글

하고 싶은 것들을 하며 성공하기
· C언어
1. auto, register, static 예약어 종류 지역 변수 전역 변수 예약어 auto register static 없음 static 선언 위치 코드 블록 내부 함수 외부 사용 범위 선언 ~ 선언한 블록 끝 프로그램 전체 하나의 파일 내부 메모리 존재 기간 선언 ~ 선언한 블록 끝 프로그램 시작 ~ 종료 자동 초기화 없음 0으로 자동 초기화 메모리 위치 스택 영역 레지스터 데이터 영역 2. 지역 변수의 주소 반환 int *get_num(void) { int n; scanf("%d", &n); return (&n); } 이런 식으로 반환하게 된다면 지역변수의 주소를 반환하기 때문에 에러 메시지를 보낸다. 왜냐하면 이 작업 이후 get_num 함수가 종료되면 n이 할당받았던 메모리를 반환하게 되고,..
· C언어
문제를 풀면서 함수를 살펴 보겠습니다. 키보드로 입력한 단어의 길이가 5자를 넘는 경우 6자부터 별(*)을 출력하는 프로그램을 작성합니다. 단어의 최대 길이는 15자로 제한합니다. (실행창에 출력되는 결과는 제가 작성한 main 함수를 참고해주세요) #include intft_strlen(char *str) { intsize; size = 0; while (*str != '\0') { size++; str++; } return (size); } char*ft_strncpy(char *dest, char *src, unsigned int size) { char*po; intcount; count = 0; po = dest; while (*src != '\0' && size > count) { *dest++..
· C언어
배열의 문자열 초기화는 여러 가지 방법이 있는데 가장 대표적인 대입 연산자를 사용한 방법으로는 두 가지가 있다. 배열 요소에 하나씩 대입해가며 마지막에 널 문자까지 넣어주는 방법과 배열 선언과 동시에 바로 큰 따옴표를 이용해 문자열을 초기화하는 것이다. 하지만 여기서 유의할 점이 있다. C언어를 조금 공부해봤다면 다들 아시겠지만 문자열은 C언어 컴파일 과정에서 주소값을 반환한다. 그런데 배열 선언 동시에 초기화하는 것은 주소를 배열에 넣는 것이 아니라 각각 배열의 요소가 초기화되고 마지막에 널 문자까지 붙여준다. 결국 사진의 주석처럼 선언을 이미 한 이후 대입을 시도할 시 문자열의 첫 번째 문자의 주소(문자열이 임시로 저장되어 있는 배열의 첫 번째 요소의 주소)를 char형에 넣어버리는 것이고, str1..
· C언어
1. gets 함수를 사용한 문자열 입력 함수 원형 char *gets(char *str) gets 함수는 버퍼에서 개행 문자를 가져오지만 배열에는 널 문자로 바꿔 저장합니다. gets 함수도 scanf 함수처럼 입력한 문자열을 포인터 연산을 통해 배열에 저장합니다. 그래서 할당된 배열의 크기보다 큰 문자열을 입력하면 배열에 할당된 메모리 공간을 벗어나 저장하므로 주의가 필요합니다. scanf 함수는 white space인 스페이스, 탭, 엔터 키를 눌러도 계속 입력을 기다립니다. scanf에서는 이들을 문자열을 구분하는 용도로만 사용하고 실제 데이터로는 사용하지 않기 때문입니다. 그러나 gets 함수는 문자열의 일부로 입력받으므로 문자열 입력 없이 처음부터 enter를 눌러도 바로 입력을 끝냅니다. 이..
· C언어
문자열 상수는 값을 바꿀 수 없으므로 바꾸려면 char 배열을 선언해야 한다. scanf의 변환문자 %s는 공백 없이 연속된 문자열만 입력 받는다. 즉 중간에 있는 공백은 전부 무시하고 연속된 단어만 취급한다. 그리고 중간에 자동으로 널 문자를 붙여준다.
· C언어
결론부터 이야기하면 주소로 접근하여 문자열을 바꿔선 안 된다. 연산 자체에는 문자가 없어서 정상적으로 컴파일되지만 실행할 때 운영체제에 의해 강제 종료될 가능성이 있다. 왜냐하면 운영체제는 문자열 상수를 따로 배열의 형태로 읽기 전용 메모리 영역에 저장하며 따라서 그 값을 바꾸는 명령의 실행을 제한한다. 운영체제마다 다를 수 있으나 호환성을 고려한다면 시도하면 안 된다. 문자열은 반환값이 문자열의 시작 주소이다. 포인터 연산을 통해 문자열의 시작 주소를 알게 되고, 문자열을 사용하려면 문자열의 마지막을 의미하는 널문자가 필요하다. 그래서 컴파일러는 문자열의 마지막에 항상 널문자를 붙여준다.
· C언어
키보드로 숫자를 입력하는 경우 일단 문자열 형태로 버퍼에 저장합니다. 그 후 문자열이 실제 연산이 가능한 값으로 변환되어 변수에 저장됩니다. 예를 들어 int 형 변수 a에 10을 입력하는 경우 문자 '1'과 '0'을 각각 아스키 코드 값으로 코드화 시켜 버퍼에 저장합니다. 그 후 변환 문자의 지시에 따라 연산이 가능한 숫자로 변환되어 변수에 저장됩니다. stdio.h 안에는 EOF를 -1로 바꾸는 전처리 지시자가 있습니다. 그렇기 때문에 enter도 자료로 사용하고 싶다면, 조건문에 ch == EOF 등으로 조건을 걸어 반복문 탈출을 접근하는 것이 좋습니다. EOF는 End Of File입니다. -1 대신 입력의 끝을 의미하는 이름으로 사용하면 좀 더 읽기 쉬운 코드를 작성할 수 있습니다.
· C언어
첫 번째, 데이터를 안정적으로 입력받을 수 있다. 버퍼는 운영체제에 따라 크기가 다를 수 있지만 일정 크기의 연속된 저장 공간이다. 따라서 키보드로 데이터를 입력하면 우선 저수조와 같은 역할을 하는 버퍼에 저장됩니다. 프로그램이 다른 일을 하느라 해당 입력을 즉시 받지 못해도 데이터가 사라지지 않아 안정적입니다. 두 번째, 입력장치와 독립적으로 사용할 수 있습니다. scanf 함수는 키보드와 직접 연결되지 않고 정해진 크기와 형태를 가진 버퍼에서 입력을 받습니다. 따라서 입력장치가 바뀌더라도 함수를 수정하지 않고 사용할 수 있습니다. 버퍼와 입력장치를 연결하는 작업은 운영체제가 담당합니다.