반응형
void main()
{
char str[] = "hi pointer cc hard,study";
char *p;
p = strtok(str, " ,");
while(p != NULL)
{
printf("%s\n", p);
p = strtok(NULL," ,");
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ
void main(void)
{
char str[12] = "Hello World";
printf("%s\n", str);
strset(str, '*');
printf("%s\n", str);
}
이럴 때 이 함수를 이용해 사용자가 입력한 문자열 길이만큼 *를 출력해 줄 수 있다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
void main(void)
{
char ch;
printf("한 문자를 입력해 주세요 : ");
scanf("%c", &ch);
if(isupper(ch) != 0)
{
printf("대문자를 입력하셨습니다.\n");
}
else
{
printf("대문자가 아닙니다.\n");
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ
void main(void)
{
char ch;
printf("한 문자를 입력해 주세요 : ");
scanf("%c", &ch);
if(isalpha(ch) != 0)
{
printf("알파벳을 입력하셨습니다.\n");
}
else
{
printf("알파벳이 아닙니다.\n");
}
}
isalpha()함수를 검색해 보면 알파벳일 때 0이 아닌 수, 알파벳이 아닐 경우 0은 반환한다고 되어 있는대 반환 값을 확인해 보니 대문자일 때는 1을, 소문자일 때는 2를 반환하는 것으로 확인했다.
ㅡㅡㅡㅡㅡ
void main(void)
{
char str[12] = "Hello World";
printf("%s\n", str);
strlwr(str);
printf("%s\n", str);
}
대소문자 구분없이 소문자로 입력받게하기
void main(void)
{
char str[12] = "Hello World";
printf("%s\n", str);
strrev(str);
printf("%s\n", str);
}
문자열을 뒤집어쥬늠 험수
void main(void)
{
char str[12] = "Hello World";
printf("%s\n", str);
strupr(str);
printf("%s\n", str);
}
무조건 대문자로 입력받기
void main()
{
int *ar;
ar = (int*)malloc(5 * sizeof(int));
ar[4] = 1234;
ar = (int*)realloc(ar, 10 * sizeof(int));
ar[9] = 5678;
printf("ar[4] = %d, ar[9] = %d\n", ar[4], ar[9]);
free(ar);
}
말록과 리얼록
동적할당하면 malloc()함수를 많이 생각한다. 동적할당을 받았고 그 후에 사이를 변경하고 싶을 때에는 어떻게 하면 될까? 바로 realloc()함수를 사용하면 된다.
free()로 지우고 새로 할당하는 개념으로 생각하면 된다. 하지만 이전 데이터는 남아 있는 것을 알 수 있다. ar[4]의 값이 지워지지 않고 그대로 출력되는 것을 보면 알 수 있다.
언제 왜 동적할당이 필요한지를 알았다면 어느 정도 프로그래밍 실력이 쌓였다고 볼 수 있다.
void main()
{
int *arScore;
int i, stNum;
int sum;
printf("학생수를 입력하세요 : ");
scanf("%d", &stNum);
arScore = (int*)malloc(stNum * sizeof(int));
if(arScore == NULL)
{
printf("메모리가 부족합니다.\n");
exit(0);
}
for(i = 0; i < stNum; i++)
{
printf("%d번 학생의 성적을 입력하세요 : ", i + 1);
scanf("%d", &arScore[i]);
}
sum = 0;
for(i = 0; i < stNum; i++)
{
sum+=arScore[i];
}
printf("\n총점은 %d점이고 평균은 %d점입니다.\n", sum, sum / stNum);
free(arScore);
}
어떤 상황에서나 배열을 사용할 수 있다면 참 편할 것이다. 하지만 프로그램을 실행하는 도중 그 길이가 정해져야 하는 상황이 있다. 학생들의 평균을 구하는 프로그램을 구현해야 한다고 하자.
만약 조건이 학생 들의 수가 정해지지 않았고 변동 가능하며 그 범위도 정해지지 않았다고 하자, 그럼 이를 배열로 선언해 프로그램을 완성시킬 수 있을까?
가능은 하겠지만 만약 배열을 잡아놓은 길이보다 학생수가 많다면 어떻게 될 것이가? 그럼 오류가 나는 프로그램이 되고 많다. 이럴 때 필요한 것이 바로 동적할당이다.
필요한 만큼 메모리를 할당해 배열을 만든다고 생각하면 쉬울 것이다.
arScore = (int*)malloc(stNum * sizeof(int));
바로 이부분이 사용자가 입력한 학생수에 해당하는 만큼 메모리를 할당해 주는 부분이다. 이 부분이 잘 이해가지 않는다면 암기라도 해야한다.
학생 수 * sizeof(int)를 함으로써 int형 배열을 선언하되 그 길이는 학생 수 만큼이 되는 것이다. 나머지 부분은 이해하는데 어려움이 없을 것이라 생각한다.
그리고 잊지 말아야 하는 것이 free()함수를 통해 메모리를 반환해 주어야 한다는 것이다.
void main()
{
int i;
time_t t1, t2;
time(&t1);
printf("프로그램 시작\n");
for (i = 0; i < 1000; i++)
{
printf("시간 끌기\t");
}
time(&t2);
printf("프로그램 종료\n");
printf("총 %.2f초가 걸렸습니다.", difftime(t2, t1));
}
이전에도 time()에 대한 포스팅을 했지만 time()함수는 초단위로 반환하여 준다.
그렇기 때문에 프로그램 시작점에서 한번 time()함수를 호출하고 프로그램 끝점에서 한번 time()함수를 호출하여 주어 그 차이를 구한다면 프로그램 실행 시간을 구할 수 있다.
다만 초단위 이기 때문에 그 이하의 단위는 버림이 된다. difftim()함수가 있는데 그냥 쉽게 말해 t2 - t1를 해주는 함수이다.
이를 출력할 때 %f가 아니라 %.2f 를 해주었는데 이는 소수점 2째자리까지 출력해 주라는 뜻이다
void main()
{
clock_t t1, t2;
int count = 0;
t1 = clock();
for(;;)
{
printf("기다리십시오. %d\n", count++);
t2 = clock();
if ((t2 - t1) > (3 * CLOCKS_PER_SEC))break;
}
printf("끝났습니다.\n");
}프로그래밍을 하다 가끔 초 단위를 count해야 할 때가 있다. 그럴 때 보통 Sleep()함수를 이용한다. Sleep()함수는 편하게 사용할 수 있지만 함수 이름 그대로 자고 있다. 아무런 일을 할 수 없다.
thread라는 녀석을 배워 여러 일을 동시에 처리한다면 모르겠지만 그건 나중에 일이고 지금은 아무런 일을 처리할 수 없다.
프로그램을 재우지 않고 일정 시간 동안 기다려야할 때 clock함수를 사용하면 된다. 윈도우 프로그램에서는 방금 설명한 프로그램을 재우지 않고 실행해야 할 경우가 드물다.
하지만 AVR, PIC, 8051등 마이크로프로세서 프로그램을 하다보면 다이나믹 제어를 하면서 delay()함수를 사용해야 하는데 이럴 경우 다이나믹 제어를 위해 delay함수를 수정해야 만 할 것이다.
아니면 timer interrupt를 사용하던지 말이다. 아무튼 내가 구현할 수 있는 방법이 많다는 것은 좋은 것이므로 clock()함수를 이용해서 for문에 잠시 가두어 둘 수 있다.
for문에 갇혀 있는 동안 이 for문 안에 원하는 동작을 넣어 주면 된다. 쉽게 말해서 버튼 입력이나 스위치 입력 등 쉬지 않아야 하는 부분을 넣어 준다는 말이다.
CLOCKS_PER_SEC 이것은 이름을 보고 눈치 챘겠지만 설명하자면 1초 동안 발생되는 클럭이라는 뜻이다. 각 cpu마다 속도 차이가 있기 때문에 이렇게 정의 된 것을 사용하면 좋다.
clock_t 라는 녀석이 보이는데 그냥 int형이라 생각하면 쉽게 이해될 것이다.
void main()
{
time_t t;
tm *pt;
time(&t);
pt = localtime(&t);
printf("현재 시간 %d년 %d월 %d일 %d시 %d분 %d초입니다.\n",
pt->tm_year + 1900, pt->tm_mon + 1, pt->tm_mday, pt->tm_hour, pt->tm_min, pt->tm_sec);
}
struct tm
{
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
};
바로 전에 time()함수를 사용하는데 있어서 불편한 점이 바로 반환 값이 초 단위로 반환된다는 것이었다. 그래서 현재 시간을 알아내기 위해서는 가공을 해 주어야 한다고 했다.
위에 있는 프로그램이 바로 그 가공해 주는 부분이다. 년도, 월, 일, 시, 분, 초 단위로 변환할 수 있다. tm 구조체의 내용도 주석처리로 넣어 놓았다. 참고해서 사용하면 좋을 것 같다.
http://jesus12.tistory.com/m/post/view/id/343
{
char str[] = "hi pointer cc hard,study";
char *p;
p = strtok(str, " ,");
while(p != NULL)
{
printf("%s\n", p);
p = strtok(NULL," ,");
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ
void main(void)
{
char str[12] = "Hello World";
printf("%s\n", str);
strset(str, '*');
printf("%s\n", str);
}
이럴 때 이 함수를 이용해 사용자가 입력한 문자열 길이만큼 *를 출력해 줄 수 있다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
void main(void)
{
char ch;
printf("한 문자를 입력해 주세요 : ");
scanf("%c", &ch);
if(isupper(ch) != 0)
{
printf("대문자를 입력하셨습니다.\n");
}
else
{
printf("대문자가 아닙니다.\n");
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ
void main(void)
{
char ch;
printf("한 문자를 입력해 주세요 : ");
scanf("%c", &ch);
if(isalpha(ch) != 0)
{
printf("알파벳을 입력하셨습니다.\n");
}
else
{
printf("알파벳이 아닙니다.\n");
}
}
isalpha()함수를 검색해 보면 알파벳일 때 0이 아닌 수, 알파벳이 아닐 경우 0은 반환한다고 되어 있는대 반환 값을 확인해 보니 대문자일 때는 1을, 소문자일 때는 2를 반환하는 것으로 확인했다.
ㅡㅡㅡㅡㅡ
void main(void)
{
char str[12] = "Hello World";
printf("%s\n", str);
strlwr(str);
printf("%s\n", str);
}
대소문자 구분없이 소문자로 입력받게하기
void main(void)
{
char str[12] = "Hello World";
printf("%s\n", str);
strrev(str);
printf("%s\n", str);
}
문자열을 뒤집어쥬늠 험수
void main(void)
{
char str[12] = "Hello World";
printf("%s\n", str);
strupr(str);
printf("%s\n", str);
}
무조건 대문자로 입력받기
void main()
{
int *ar;
ar = (int*)malloc(5 * sizeof(int));
ar[4] = 1234;
ar = (int*)realloc(ar, 10 * sizeof(int));
ar[9] = 5678;
printf("ar[4] = %d, ar[9] = %d\n", ar[4], ar[9]);
free(ar);
}
말록과 리얼록
동적할당하면 malloc()함수를 많이 생각한다. 동적할당을 받았고 그 후에 사이를 변경하고 싶을 때에는 어떻게 하면 될까? 바로 realloc()함수를 사용하면 된다.
free()로 지우고 새로 할당하는 개념으로 생각하면 된다. 하지만 이전 데이터는 남아 있는 것을 알 수 있다. ar[4]의 값이 지워지지 않고 그대로 출력되는 것을 보면 알 수 있다.
언제 왜 동적할당이 필요한지를 알았다면 어느 정도 프로그래밍 실력이 쌓였다고 볼 수 있다.
void main()
{
int *arScore;
int i, stNum;
int sum;
printf("학생수를 입력하세요 : ");
scanf("%d", &stNum);
arScore = (int*)malloc(stNum * sizeof(int));
if(arScore == NULL)
{
printf("메모리가 부족합니다.\n");
exit(0);
}
for(i = 0; i < stNum; i++)
{
printf("%d번 학생의 성적을 입력하세요 : ", i + 1);
scanf("%d", &arScore[i]);
}
sum = 0;
for(i = 0; i < stNum; i++)
{
sum+=arScore[i];
}
printf("\n총점은 %d점이고 평균은 %d점입니다.\n", sum, sum / stNum);
free(arScore);
}
어떤 상황에서나 배열을 사용할 수 있다면 참 편할 것이다. 하지만 프로그램을 실행하는 도중 그 길이가 정해져야 하는 상황이 있다. 학생들의 평균을 구하는 프로그램을 구현해야 한다고 하자.
만약 조건이 학생 들의 수가 정해지지 않았고 변동 가능하며 그 범위도 정해지지 않았다고 하자, 그럼 이를 배열로 선언해 프로그램을 완성시킬 수 있을까?
가능은 하겠지만 만약 배열을 잡아놓은 길이보다 학생수가 많다면 어떻게 될 것이가? 그럼 오류가 나는 프로그램이 되고 많다. 이럴 때 필요한 것이 바로 동적할당이다.
필요한 만큼 메모리를 할당해 배열을 만든다고 생각하면 쉬울 것이다.
arScore = (int*)malloc(stNum * sizeof(int));
바로 이부분이 사용자가 입력한 학생수에 해당하는 만큼 메모리를 할당해 주는 부분이다. 이 부분이 잘 이해가지 않는다면 암기라도 해야한다.
학생 수 * sizeof(int)를 함으로써 int형 배열을 선언하되 그 길이는 학생 수 만큼이 되는 것이다. 나머지 부분은 이해하는데 어려움이 없을 것이라 생각한다.
그리고 잊지 말아야 하는 것이 free()함수를 통해 메모리를 반환해 주어야 한다는 것이다.
void main()
{
int i;
time_t t1, t2;
time(&t1);
printf("프로그램 시작\n");
for (i = 0; i < 1000; i++)
{
printf("시간 끌기\t");
}
time(&t2);
printf("프로그램 종료\n");
printf("총 %.2f초가 걸렸습니다.", difftime(t2, t1));
}
이전에도 time()에 대한 포스팅을 했지만 time()함수는 초단위로 반환하여 준다.
그렇기 때문에 프로그램 시작점에서 한번 time()함수를 호출하고 프로그램 끝점에서 한번 time()함수를 호출하여 주어 그 차이를 구한다면 프로그램 실행 시간을 구할 수 있다.
다만 초단위 이기 때문에 그 이하의 단위는 버림이 된다. difftim()함수가 있는데 그냥 쉽게 말해 t2 - t1를 해주는 함수이다.
이를 출력할 때 %f가 아니라 %.2f 를 해주었는데 이는 소수점 2째자리까지 출력해 주라는 뜻이다
void main()
{
clock_t t1, t2;
int count = 0;
t1 = clock();
for(;;)
{
printf("기다리십시오. %d\n", count++);
t2 = clock();
if ((t2 - t1) > (3 * CLOCKS_PER_SEC))break;
}
printf("끝났습니다.\n");
}프로그래밍을 하다 가끔 초 단위를 count해야 할 때가 있다. 그럴 때 보통 Sleep()함수를 이용한다. Sleep()함수는 편하게 사용할 수 있지만 함수 이름 그대로 자고 있다. 아무런 일을 할 수 없다.
thread라는 녀석을 배워 여러 일을 동시에 처리한다면 모르겠지만 그건 나중에 일이고 지금은 아무런 일을 처리할 수 없다.
프로그램을 재우지 않고 일정 시간 동안 기다려야할 때 clock함수를 사용하면 된다. 윈도우 프로그램에서는 방금 설명한 프로그램을 재우지 않고 실행해야 할 경우가 드물다.
하지만 AVR, PIC, 8051등 마이크로프로세서 프로그램을 하다보면 다이나믹 제어를 하면서 delay()함수를 사용해야 하는데 이럴 경우 다이나믹 제어를 위해 delay함수를 수정해야 만 할 것이다.
아니면 timer interrupt를 사용하던지 말이다. 아무튼 내가 구현할 수 있는 방법이 많다는 것은 좋은 것이므로 clock()함수를 이용해서 for문에 잠시 가두어 둘 수 있다.
for문에 갇혀 있는 동안 이 for문 안에 원하는 동작을 넣어 주면 된다. 쉽게 말해서 버튼 입력이나 스위치 입력 등 쉬지 않아야 하는 부분을 넣어 준다는 말이다.
CLOCKS_PER_SEC 이것은 이름을 보고 눈치 챘겠지만 설명하자면 1초 동안 발생되는 클럭이라는 뜻이다. 각 cpu마다 속도 차이가 있기 때문에 이렇게 정의 된 것을 사용하면 좋다.
clock_t 라는 녀석이 보이는데 그냥 int형이라 생각하면 쉽게 이해될 것이다.
void main()
{
time_t t;
tm *pt;
time(&t);
pt = localtime(&t);
printf("현재 시간 %d년 %d월 %d일 %d시 %d분 %d초입니다.\n",
pt->tm_year + 1900, pt->tm_mon + 1, pt->tm_mday, pt->tm_hour, pt->tm_min, pt->tm_sec);
}
struct tm
{
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
};
바로 전에 time()함수를 사용하는데 있어서 불편한 점이 바로 반환 값이 초 단위로 반환된다는 것이었다. 그래서 현재 시간을 알아내기 위해서는 가공을 해 주어야 한다고 했다.
위에 있는 프로그램이 바로 그 가공해 주는 부분이다. 년도, 월, 일, 시, 분, 초 단위로 변환할 수 있다. tm 구조체의 내용도 주석처리로 넣어 놓았다. 참고해서 사용하면 좋을 것 같다.
http://jesus12.tistory.com/m/post/view/id/343
반응형