C언어

· 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언어
이 때에는 배열의 저장 공간이 할당되지 않으며, 매개변수로 선언된 배열의 이름은 자동으로 포인터 변수오 바뀐다. 형식은 유지한 체 포인터 변수로 변경된다는 의미이다. 컴파일러는 배열명을 자동으로 포인터로 바꾸고 타 함수에서 선언된 배열의 모든 배열 요소를 사용할 수 있도록 포인터 연산을 수행한다. 그리고 타 함수에서 선언된 배열의 크기는 알 수 없으므로 알고 싶다면 따로 반드시 요소의 개수를 인수로 받아야 한다. 정리하면 배열로 매개변수에 선언하면 크기를 생략하든 어떤 수로 적었든 컴파일러가 자동으로 포인터로 변경한다.
· C언어
처음에 이 문제를 만나서 당황했다. 비트 연산인가..? 3*100 + 8 * 10 + 5 * 1 이렇게 나눠서 하는건가? 등등 고민하다가 결국 간단하게 연산자로 풀 수 있다는 것을 깨달았다. 정답은 가까이에.. #include int main(void) { int a, b; int one, ten, hundred; scanf("%d%d", &a, &b); hundred = b / 100; ten = (b % 100) / 10; one = (b % 100) % 10; printf("%d\n", a * one); printf("%d\n", a * ten); printf("%d\n", a * hundred); printf("%d\n", a * b); return 0; } int형 변수 one, ten, hun..
· C언어
1. 주소와 포인터는 상수와 변수 차이와 같다. 1) 포인터는 변수처럼 공간으로도 사용할 수 있지만, 주소는 상수처럼 정해져 있는 값만 사용할 수 있지 공간으로는 사용할 수 없다. 예를 들면 C언어에서 등호(=) 좌측에 공간이 오고, 등호 우측에는 값이 온다. 이때 주소 값 자체는 좌측(L-value)로 올 수 없다. #include int main(void){ int a = 1; int *pa = &a; // 포인터는 변수와 같아서 L-value로 쓰이는 것이 가능하다. &a = 100; // 주소는 상수 값이라 L-value로 쓰이는 것이 불가능하다. return 0; } (위 예시는 보여주기 위함으로 작성한 것이라 실제 컴파일하면 오류를 가져온다) 2) 둘 다 산술 연산자는 사용 가능하다. 2. 포..
jayoon
'C언어' 카테고리의 글 목록 (2 Page)