본문 바로가기

기초공부/C

[C]자료형과 printf, scanf 서식 정리 맨날 까먹어서 인터넷 뒤지길래 정리함 1. 자료형 정리 정수형char1바이트-128 이상 +127 이하 unsigned char0 이상 (128+127) 이하 short2바이트-32,768 이상 +32,767 이하 unsigned short0 이상 (32,768+32,767) 이하 int4바이트-2,147,483,648 이상 +2,147,483,647 이하 unsigned int0 이상 (2,147,483,648+2,147,483,647) 이하 long4바이트-2,147,483,648 이상 +2,147,483,647 이하 unsigned long0 이상 (2,147,483,648+2,147,483,647) 이하 long long4바이트-9,223,372,036,854,775,808 이상 +9,223,37..
[C]상수형태의 문자열을 매개변수로 전달할 때 문득 이런 생각이 들었다. 함수를 정의할 때 문자열의 매개변수를 정의하면 포인터 형식이나 배열 형식이나 똑같이 취급한다. 그렇다면 실제로 포인터나 배열 형식의 문자열을 전달한다면 어떻게 취급할까. 포인터 형식으로 취급할까, 문자열 형식으로 취급할까. 궁금해서 실제로 간단하게 실험해보았다 배열 형식의 문자열과 포인터 형식의 문자열을 함수에 인수로 전달하였다. 결과는 함수를 사용하지 않았을 때와 했던 실험과 똑같은 결과가 나왔다.(이전 실험 참고) 이 결과를 놓고 생각해보았다. 함수를 정의할때의 매개변수의 형식은 실제 문자열에 어떠한 영향을 끼치지 않는다고 당연하게 생각할 수 있었다. 궁금증을 해결할 수 있어 원래는 함수의 매개변수를 정의한 형식이 배열일 때도 해봐야 했지만 실험을 끝냈다.
[C]문자열의 길이를 체크할 땐 strlen 함수를 사용하자 맨날 까먹고 sizeof 연산자를 사용해서 적어놓는다. sizeof 연산자를 사용하면 포인터로 선언한 문자열은 주소의 크기인 4바이트를 출력하고 str2는 원소의 개수+1(NULL)을 출력한다. 그러니까 strlen함수를 쓰자.
[C]상수 형태의 문자열 문제를 풀던 중 헷갈렸던 부분이 있어서 정리한다. strcpy_s함수를 사용하던 중 문제가 발생했다. 왜 안 되는지 예제와 비교하여 확인해보았다. str을 포인터로 선언했고 예제에서는 배열로 선언했다는 점이 유일하게 달랐다. 실제로 배열로 선언해서 실행하니 프로그램이 원활하게 돌아갔다. 이유를 생각해보니 이전에 포인터에서 공부했던 내용과 연관시킬 수 있었다. 포인터로 선언한 문자열은 변환할 수 없고, 배열로 선언한 문자열은 변환할 수 있다. 이를 떠올리니 왜 실행이 되지 않았는지 이해했다. strcpy는 문자열을 변환하는 함수이므로 포인터 형식의 문자열을 사용할 수 없다. 그걸 까먹고 sizeof 연산자의 문제인지 한참 헤메고 있었다. 하하하.
[C]printf %c, %s 서식의 차이점 문제 풀다가 궁금증이 일어 %c와 %s와 관련하여 실험을 하였다. printf로 한 문자열을 출력하면 어떻게 출력될까. 결과는 다음과 같았다. 결과를 보고 기존의 지식과 연관지어 추론해보았다. 우선 %c를 서식으로 했을 때 문자열의 주소인 str을 출력했을 때랑 문자열의 내용인 *str을 출력했을 때를 비교해보자. %c는 한 문자를 출력하므로 전자는 문자열 주소의 첫 글자인 0이 출력되었다고 추측했다. 실제로 서식문자를 %p로 하여 주소를 출력하면 첫 글자가 0으로 나온다. 후자는 한 문자를 출력하는데 대상이 문자열의 첫글자를 주소로 하는 문자이므로 h가 출력되는 것이 당연하다. 만약 *(str+1)을 출력한다면 e가 출력되었을 것이다. %s를 서식으로 했을 때를 살펴보자. %s는 대상(이 경우는 str..