전체 글

하고 싶은 것들을 하며 성공하기
· 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 함수는 키보드와 직접 연결되지 않고 정해진 크기와 형태를 가진 버퍼에서 입력을 받습니다. 따라서 입력장치가 바뀌더라도 함수를 수정하지 않고 사용할 수 있습니다. 버퍼와 입력장치를 연결하는 작업은 운영체제가 담당합니다.
· C언어
1. 문자열 상수 구현 및 방법 1) 문자열은 컴파일러가 특별한 방식으로 다룬다. 문자열은 크기가 일정하지 않다. 따라서 컴파일러가 문자열을 처리할 때 특별한 방법으로 처리한다. 컴파일 과정에서 문자열을 char 배열 형태로 따로 보관하고, 문자열 상수가 있던 곳에는 배열의 위치 값을 사용한다. 예를 들어 문자열 "apple"은 따로 리터럴 영역에 수정할 수 없는 문자열 상수로 저장되고, 이 자리는 'a' 문자가 저장된 메모리의 주소값으로 바뀐다. 2) 문자열이나 문자열을 저장한 포인터를 주소로 접근하여 문자열 자체를 바꿔서는 안 된다. *"apple" = 't' 등으로 첫 번째 문자가 저장된 공간에 다른 문자를 대입해 그 값을 바꾸려는 시도는 위험하다. 연산 자체는 문제가 없어 정상적으로 컴파일 되지만..
· C언어
%c는 scanf 함수에서 사용될 때 알파벳이나 숫자 모양의 문자(단순 정수가 아님) 등 형태가 있는 문자를 입력하지만 공백이나 탭 문자, 개행 문자와 같은 제어 문자도 입력하므로 주의해야한다. tip 다른 함수 사용 다른 함수는 조만간...업로드
· C언어
이 때에는 배열의 저장 공간이 할당되지 않으며, 매개변수로 선언된 배열의 이름은 자동으로 포인터 변수오 바뀐다. 형식은 유지한 체 포인터 변수로 변경된다는 의미이다. 컴파일러는 배열명을 자동으로 포인터로 바꾸고 타 함수에서 선언된 배열의 모든 배열 요소를 사용할 수 있도록 포인터 연산을 수행한다. 그리고 타 함수에서 선언된 배열의 크기는 알 수 없으므로 알고 싶다면 따로 반드시 요소의 개수를 인수로 받아야 한다. 정리하면 배열로 매개변수에 선언하면 크기를 생략하든 어떤 수로 적었든 컴파일러가 자동으로 포인터로 변경한다.
jayoon
자윤 블로그