051.문자 입력하기 getch()
키보드로부터 문자를 한 개 입력 받는다.
getch()를 통해 문자를 입력받을 때F1, F2,Ctrl+a~Ctrl+z, Home,End, PgUp, PgDn, 방향키 등의 특수키를 입력받는경우두 번에 걸쳐 키 값을 읽어온다.
#include <conio.h>
int getch(void);
예제-051.c
#include <stdio.h>
#include <conio.h>
#define ENTER 13
void main(void)
{
int ch;
printf("아스키 코드로 변환할 키를 누르세요...\n");
printf("Enter 키를 누르면 프로그램은 종료됩니다.\n");
do
{
ch = getch();
printf("문자 : (%c), 아스키 코드 = (%d)\n", ch, ch);
}while(ch != ENTER);
}
052. 문자 출력하기putch()
키보드로부터 입력받은 문자를 출력한다.
#include <conio.h>
intputch(int ch);
예제-052.c
#include <stdio.h>
#include <conio.h>
int print(char *string);
void main(void)
{
print("This is a putch function!");
}
int print(char *string)
{
int len = 0;
while(*string != (char)NULL)
{
putch(*string);
*string++;
len++;
}
putch('\r');
putch('\n');
return len;
}
053.정수값 입력 받기 scanf()
정수 값 or 문자열을 입력 받는다.
#include <stdio.h>
int scanf(const char *format [, argument]...);
정수 값을 입력 받을때는 번지 지정 연산자(&)를 이용한다.
intp;
scanf("%d",&p);
문자열을 입력 받을 때는 번지지정 연산자가 필요없다.
char str[10];
scanf("%s",str);
예제-053.c
#include <stdio.h>
void main(void)
{
int count;
int tmp;
int total = 0;
for(count=1;count<=3;count++)
{
printf("%d번째 정수값을 입력한 후 Enter키를 누르세요.\n", count);
scanf("%d", &tmp);
total += tmp;
printf("입력 값 = %d, 총합 = %d\n", tmp, total);
}
printf("읽은 정수의 총 합은 %d입니다.\n", total);
}
054. 정수값 출력하기 printf()
#include <stdio.h>
int printf(constchar *format [, argument]...);
출력인자의 갯수가 고정이 아닌가변적이기 때문에[,argument]... 처럼선언.
왼쪽정렬은 '-'기호를사용한다.
printf("[%-10d]\n",100); // 왼쪽정렬이면서 자리수가 최소 10자리가 되도록 설정
가변인자를 사용하는 함수를 만들어printf() 기능 구현
#include<stdarg.h>
void var_print(char *format, ...)
{
char buf[1024];
va_list arglist;
va_start(arglist, format);
vsprintf(buf, format,arglist);
va_end(arglist);
printf(buf);
}
예제-054.c
#include <stdio.h>
void main(void)
{
int i = 100;
int j = 1000;
int k = 12345;
printf("[%d]\n", i);
printf("[%d]\n", j);
printf("[%d]\n", k);
printf("[%5d]\n", i);
printf("[%5d]\n", j);
printf("[%5d]\n", k);
printf("[%10d]\n", i);
printf("[%10d]\n", j);
printf("[%10d]\n", k);
printf("[%-10d]\n", i);
printf("[%-10d]\n", j);
printf("[%-10d]\n", k);
}
055.문자열 입력 받기 gets()
#include <stdio.h>
char*gets(char *buffer);
문자열 입력받기.
번지 지정 연산자(&) 사용 안한다.
예제-055.c
#include <stdio.h>
int count(char *str);
void main(void)
{
char string[100];
char *ret;
ret = gets(string);
if(ret != NULL) {
printf("문자 'a'의 갯수는 %d개 입니다.\n", count(string));
}
}
int count(char *str)
{
int cnt = 0;
while(*str != (char)NULL)
{
if(*str++ == 'a') cnt++;
}
return cnt;
}
056.문자열 출력하기 puts()
#include <stdio.h>
int puts(const char *string);
인수로 넘겨주는 문자열은 puts() 함수 내부적으로 문자열 상수처럼 사용되기 때문에, puts() 함수 실행 후에도변하지 않는다.
출력 시에 자동으로 다음 줄로 개행한다.
예제-056.c
#include <stdio.h>
#define KOREA "대한민국"
#define SUMMER "여름"
void main(void)
{
const char *winter = "겨울";
puts(KOREA);
puts(SUMMER);
puts(winter);
}
057. 문자열 복사하기 strcpy(), strncpy(), strdup()
#include <string.h>
char *strcpy(char *dist, const char *src);
문자열을 부분적으로 복사하려면,strncpy()을 사용한다.
#incude<string.h>
int strncpy(char *string1,const char *string2,unsigned int count);
메모리할당을 하면서 문자열을 복사,strdup()
#include <string.h>
cha *strdup(const char *str);
문자열을 복사할 공간을 확보하기 위해 내부적으로malloc()을 호출하는 것을 제외하고는 strcpy()와 동일하다.
따라서,반드시 free()를 이용하여 메모리를 해제 해주어야 한다.
예제-057.c
#include <stdio.h>
#include <string.h>
#define KOREA "대한민국"
void main(void)
{
char *string1;
char string2[100];
//strcpy(string1, KOREA);
string1 = KOREA;
strcpy(string2, KOREA);
strcpy(string2, "봄");
puts(string1);
puts(string2);
}
058.문자열을 복사하는 함수 만들기
#include <stdio.h>
#define KOREA "대한민국"
char *My_strcpy(char *dest, const char *src);
void main(void)
{
char string[100];
My_strcpy(string, KOREA);
puts(string);
}
char *My_strcpy(char *dest, const char *src)
{
if(dest == (int)NULL || src == (int)NULL)
{
if(*dest != (int)NULL) *dest = (int)NULL;
return NULL;
}
do
{
*dest++ = *src;
}while(*src++ != (int)NULL);
return dest;
}
059. 문자열을 대, 소문자로 구분하여 비교하기 strcmp()
#include <string.h>
int strcmp(const char *src1,const char *src2);
-1 : 문자열이 작은 경우
0 : 문자열 일치
1 : 문자열이 클경우
문자열의 대, 소문자를 구분하여 비교.
대, 소문자 구분없이 비교하려면, _stricmp()을 사용한다.
#include <string.h>
int_stricmp(const char *src1, const char *src2);
예제-059.c
#include <stdio.h>
#include <string.h>
#define SKY "sky"
void main(void)
{
char string[100];
int ret;
printf("영단어를 입력한 후 Enter키를 치세요.\n");
printf("sky를 입력하면 프로그램이 종료됩니다.\n");
do
{
gets(string);
ret = strcmp(string, SKY);
if(ret == 0)
{
printf("%s == %s, ret = %d \n", string, SKY, ret);
break;
}
else if(ret < 0)
printf("%s < %s, ret = %d \n", string, SKY, ret);
else
printf("%s > %s, ret = %d \n", string, SKY, ret);
} while(1);
}
060. 문자열을 비교하는함수 만들기
#include <stdio.h>
#define SKY "sky"
int My_strcmp(const char *string1, const char *string2);
void main(void)
{
char string[100];
int ret;
printf("영단어를 입력한 후 Enter키를 치세요.\n");
printf("sky를 입력하면 프로그램이 종료됩니다.\n");
do
{
gets(string);
ret = My_strcmp(string, SKY);
if(ret == 0)
{
printf("%s == %s, ret = %d \n", string, SKY, ret);
break;
}
else if(ret < 0)
printf("%s < %s, ret = %d \n", string, SKY, ret);
else
printf("%s > %s, ret = %d \n", string, SKY, ret);
} while(1);
}
int My_strcmp(const char *string1, const char *string2)
{
if(*string1 == (int)NULL && *string2 == (int)NULL) return 0;
while(*string1 != (int)NULL)
{
if(*string2 == (int)NULL) return 1;
if(*string1 == *string2)
{
*string1++;
*string2++;
continue;
}
if(*string1 < *string2) return -1;
else return 1;
}
if(*string2 != (int)NULL) return -1;
return 0;
}
061.문자열을 일정크기만큼 비교하기 strncmp()
문자열의 특정길이 만큼만비교한다. 그 외에는 strcmp()와동일. 대, 소문자 구분.
#include <stdio.h>
int strncmp(const char* src1,const char *src2,unsignedint count);
대,소문자 구분없이비교하려면, _strnicmp()을사용한다.
int _strnicmp(const char *string1,const char *string2,unsigned int count);
예제-061.c
#include <stdio.h>
#include <string.h>
#define SKY "sky"
void main(void)
{
char string[100];
int ret;
printf("영단어를 입력한 후 Enter키를 치세요!\n");
printf("sky로 시작되는 단어를 입력하면 프로그램이 종료됩니다.\n");
do
{
gets(string);
ret = strncmp(string, SKY, 3);
if(ret == 0)
{
printf("%3.3s == %s, ret = %d \n", string, SKY, ret);
break;
}
else if(ret < 0)
printf("%s < %s, ret = %d \n", string, SKY, ret);
else
printf("%s > %s, ret = %d \n", string, SKY, ret);
} while(1);
}
062. 문자열 연결하기 strcat(), strncat()
#include <string.h>
char *strcat(char *dest, const char *src);
문자열은dest 문자열에 추가되기 때문에 dest 버퍼는 src 문자열을 추가할 만큼의 충분한 버퍼가 있어야 한다.
문자열을 부분적으로 연결하려면,strncat()을 사용한다.
#include<string.h>
char*strncat(char *dest, const char *src,unsigned int count);
예제-062.c
#include <stdio.h>
#include <string.h>
void main(void)
{
char string1[100];
char string2[100];
printf("첫 번째 단어를 입력하세요!\n");
gets(string1);
printf("두 번째 단어를 입력하세요!\n");
gets(string2);
strcat(string1, string2);
puts(string1);
}
063.문자열의 길이구하기strlen()
#include<string.h>
unsigned int strlen(const char *string);
예제-063.c
#include <stdio.h>
#include <string.h>
void main(void)
{
char string[200];
printf("문장을 입력한 후, Enter 키를 치세요.\n");
printf("아무것도 입력하지 않으면 프로그램은 종료됩니다.\n");
do
{
gets(string);
if(!strlen(string)) break;
printf("문자열의 길이는 %d입니다.\n", strlen(string));
}while(1);
}
064. 문자열 검색하기 strstr()
#include <string.h>
char *strstr(const char *string, const char *strCharSet);
문자열이 검색된 경우, 찾은 위치에 대한 메모리 번지를 반환하는데, 이 반환 값은 하상 문자 배열 변수 string이 가리키는 번지보다 크거나 같다.
따라서,검색 문자열이 몇 번째 위치에서 검색되었는지는 검색된 번지와 문자열의시작 번지로 구할 수 있다.
예제-064.c
#include <stdio.h>
#include <string.h>
#define SKY "sky"
void main(void)
{
char string[100];
char *ret;
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("문자열 중에 sky가 포함되어 있으면, 프로그램은 종료됩니다.");
do
{
gets(string);
ret = strstr(string, SKY);
if(ret == NULL)
{
puts("문자열 중에 sky가 없습니다.");
}
else
{
printf("%d 위치에서 sky 문자열을 찾았습니다.\n", ret-string);
break;
}
}while(1);
}
065. 문자열 중에서 문자 검색하기 strchr(), strrchr()
#include<string.h>
char *strchr(const char* striing, intc);
뒤에서부터 검색
#include<string.h>
char *strrchr(const char *string, int c);
문자가 검색된 경우, 찾은 위치에 대한 메모리 번지를 반환하는데, 이 반환 값은 하상 문자 배열 변수 string이 가리키는 번지보다 크거나 같다.
따라서,검색 문자가 몇 번째 위치에서 검색되었는지는 검색된 번지와 문자열의시작 번지로 구할 수 있다.
예제-065.c
#include <stdio.h>
#include <string.h>
#define FIND_CHAR 'h'
void main(void)
{
char string[100];
char *ret;
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("문자열 중에 'h'가 포함되어 있으면, 프로그램은 종료됩니다.");
do
{
gets(string);
ret = strchr(string, FIND_CHAR);
if(ret == NULL)
{
puts("문자열 중에 'h'가 없습니다.");
}
else
{
printf("%d 위치에서 'h' 문자를 찾았습니다.\n", ret-string);
break;
}
}while(1);
}
066. 문자열 중에서 일치되는 첫 문자의 위치 구하기 strcspn()
#include <string.h>
unsigned int strcspn(const char*string,const char *strCharSet);
문자열or 문자 검색 함수에서검색된 번지와 문자열의 시작번지를 통해 구했던 검색 문자의 위치를 strcspn()으로 간단하게 구할 수 있다.
예제-066.c
#include <stdio.h>
#include <string.h>
void main(void)
{
char *string = "This is a string $$$";
char *strCharSet = "
unsigned int pos;
pos = strcspn(string, strCharSet);
puts("0 1 2 3");
puts("0123456789012345678901234567890");
puts(string);
puts(strCharSet);
printf("%d 위치에서 일치되는 첫 문자를 발견하였습니다.\n", pos);
}
067.문자열 중에서 일치되지 않는첫 문자의 위치 구하기strspn()
#include <string.h>
unsigned int strspn(const char *string, constchar *strCharSet);
예제-067.c
#include <stdio.h>
#include <string.h>
void main(void)
{
char *string = "this is a very good!";
char *strCharSet = "abcdefghijklmnopqrstuvwxyz "; // 주의 : 공백포함
unsigned int pos;
pos = strspn(string, strCharSet);
puts("0 1 2 3");
puts("0123456789012345678901234567890");
puts(string);
puts(strCharSet);
printf("%d 위치에서 일치되지 않는 문자를 발견했습니다.\n", pos);
}
068.문자열을 구분자로 분리하기1strtok()
#include <string.h>
char *strtok(char*strToken, constchar *strDelimit);
strtok() 함수는 내부적으로 이전에검색한 위치를 저장한다.
따라서,string이 NULL을 strtok() 함수에 넘겨주면, 검색된 다음 위치부터 자동으로 검색한다.
예제-068.c
#include <stdio.h>
#include <string.h>
#define TOKEN " "
void main(void)
{
char string[100];
char *token;
puts("문자열을 입력한 후 Enter키를 치세요!");
gets(string);
token = strtok(string, TOKEN);
while(token != NULL)
{
puts(token);
token = strtok(NULL, TOKEN);
}
}
069.문자열을 구분자로 분리하기2 strpbrk()
#include <string.h>
char *strtok(char *strToken, const char *strDelimit);
예제-069.c
#include <stdio.h>
#include <string.h>
#define TOKEN " "
void main(void)
{
char string[100];
char *pos;
puts("문자열을 입력한 후 Enter키를 치세요!");
gets(string);
pos = strpbrk(string, TOKEN);
while(pos != NULL)
{
puts(pos++);
pos = strpbrk(pos, TOKEN);
}
}
공백을 찾은 경우, 공백이 있는 자리에 대한 번지를 반환한다.
strtok()와 strpbrk() 함수는 문자열을 구분하는 방법의 차이가 있으니구분해서 사용해야 한다.
070. 문자여을 특정 문자로 채우기strset()
#include<string.h>
char *strset(char*string, int c);
string은 채울 버퍼이며, c는 채울 문자이다.
strset()은 string에서 널 문자를제외한 모든 문자를c로 변경한다.
예제-070.c
#include <stdio.h>
#include <string.h>
void main(void)
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(!strlen(string)) break;
strset(string, string[0]);
puts(string);
}while(1);
}
071.부분 문자열을 특정 문자로 채우기 strnset()
#include <string.h>
char *strnset(char *string, intc, unsigned int count);
string은 채울 버퍼이며, c는 채울 문자익, count는 채울 문자의 수이다.
strnset()은 string의 처음부터 count의 수만큼c로 변경한다.
count의 값이 strlen(string)보다 크거나 같다면strnset()은 string에 포함되어 있는모든 문자를 변경합니다.
예제-071.c
#include <stdio.h>
#include <string.h>
void main(void)
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(!strlen(string)) break;
strnset(string, '*', 5);
puts(string);
}while(1);
}
072. 문자열을 대문자로 변환하기 strupr()
#include <string.h>
char *strupr(char *string);
string은 반드시 문자열 버퍼이거나 문자열 버퍼를 가리키는 포인터이어야한다.
만약, 문자열 상수 등을string에 사용한다면 메모리 에러가 발생되면서 프로그램은 다운될 수 있다.
예를 들어, char *str;이라고 정의한 후 strupr(str)이라고 사용할 수는 없다.
예제-072.c
#include <stdio.h>
#include <string.h>
void main(void)
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(!strlen(string)) break;
strupr(string);
puts(string);
}while(1);
}
073.문자열을 소문자로 변환하기
#include <string.h>
char *strlwr(char *string);
예제-073.c
#include <stdio.h>
#include <string.h>
void main(void)
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(!strlen(string)) break;
strlwr(string);
puts(string);
}while(1);
}
074.문자열을 거꾸로 뒤집기 strrev()
#include <string.h>
char *strrev(char *string);
예제-074.c
#include <stdio.h>
#include <string.h>
void main(void)
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(!strlen(string)) break;
strrev(string);
puts(string);
}while(1);
}
075.문자열을 중복 생성하기 strdup()
#include <string.h>
char *strdup(const char *string);
strdup() 함수는 내부적으로 메모리를 할당하는malloc() 함수를 사용한다.
프로그램 도중에잠깐 임시 버퍼가 필요할 때 사용할 수 잇다.
malloc()함수에의해 할당된 메모리는반드시 free() 함수에 의해 해제되어야 한다.
예제-075.c
#include <stdio.h>
#include <string.h>
#include <malloc.h>
void main(void)
{
char string[100];
char *pstr;
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(!strlen(string)) break;
pstr = strdup(string);
strcpy(string, "temporary string");
printf("문자열 string : %s\n", string);
printf("문자열 pstr : %s\n", pstr);
free(pstr);
}while(1);
}
076.문자열을 형식화하기 sprintf()
#include <stdio.h>
int sprintf(char *buffer, const char *format[,argument]...);
sprintf() 함수는printf() 함수와 사용 방법이 같다.
단지, printf() 함수는 화면에 출력할때 사용하며,sprintf() 함수는 버퍼에 형식화된 문자열을 생성할때 사용한다.
예제-076.c
#include <stdio.h>
void main(void)
{
char cValue = 'a';
int iValue = 1234567;
long lValue = 7890123;
float fValue = 3.141592;
double dValue = 3.141592;
char *string = "korea";
char buffer[100];
sprintf(buffer, "char 형은 : %c", cValue);
puts(buffer);
sprintf(buffer, "int 형은 : %d", iValue);
puts(buffer);
sprintf(buffer, "long 형은 : %ld", lValue);
puts(buffer);
sprintf(buffer, "float 형은 : %f", fValue);
puts(buffer);
sprintf(buffer, "double 형은 : %e", dValue);
puts(buffer);
sprintf(buffer, "char* 형은 : %s", string);
puts(buffer);
}
077.문자열을 정수로 변환하기1atoi()
#include <stdlib.h>
int atoi(const char *string);
변환 가능한 문자열은 공백, 탭, 기호(+,-) 그리고 숫자뿐이다.
예제-077.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
int count;
int total = 0;
char string[100];
for(count=1;count<=3;count++)
{
printf("%d 번째 문자열을 입력한 후 Enter키를 누르세요.\n", count);
gets(string);
total += atoi(string);
printf("입력 값 = %d, 총 합 = %d\n", atoi(string), total);
}
printf("읽은 문자열의 총 합은 %d입니다.\n", total);
}
078.문자열을 정수로 변환하기2 atol()
#include <stdlib.h>
long atol(const char *string);
atoi() 함수와 사용법이 동일.단지, 반환 값이 long형이라는 점이 다르다.
079. 문자열을 정수로 변환하기3 strtol()
#include <stdlib.h>
long strtol(const char *string, char**stop, int radix);
strtol() 함수는atoi(), atol() 함수와는 달리, 기수라는 것이 존재한다.
기수라는 것은 10진수, 2진수, 8진수, 16진수 등과 같이 각 진수의 기본이 되는 수를 말한다. radix를 통해변경할 수 있다.
radix의 값을 2로 하면 2진수 문자열을10진수로, 8로하면8?진수 문자열을 10진수로 변환할 수 있다.
예제-079.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
char *string = "0xFF";
char *stop;
int radix;
long value;
radix = 16;
value = strtol(string, &stop, radix);
printf("%d 개의 문자가 변환 되었습니다.\n", stop-string);
printf("16진수 %s를 숫자로 변환하면 %ld입니다.\n", string, value);
}
080.문자열을 정수로 변환하기4 strtoul()
#include <stdlib.h>
unsigned long strtoul(const char *string, char **stop, int radix);
strtol() 함수와 사용법이같다. 단지,반환 값이 unsignedlong(%u)형이라는 점이 다르다.
081.문자열을 실수로 변환하기1 atof()
#include <stdlib.h>
double atof(const char *string);
변환 가능한 문자열은 공백, 탭, 기호(+,-), 숫자, 소수점 그리고지수(d,D,e, E) 뿐이다.
최대 100자리의 문자열을 숫자로 변환 할 수 있다.
사용법은 atoi()와 동일하면, 반환 값이 double형(%lf)이라는 점이 다르다.
082.문자열을 실수로 변환하기2 strtod()
#include <stdlib.h>
doublestrtod(const char *string, char **stop);
string은 지수가 포함된 문자열이며, stop은 변환이 되다가 멈춰진 위치의 포인터 값.
atof() 함수와 비슷한기능.
예제-082.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
char *string = "1.234E-10";
char *stop;
double value;
value = strtod(string, &stop);
printf("%d 개의 문자가 변환되었습니다.\n", stop-string);
printf("문자열 [%s]를 숫자로 변환하면 %E입니다.\n", string, value);
}
083. 정수를 문자열로 변환하기1 itoa()
#include<stdio.h>
char*itoa(int value, char*string, int radix);
value는 변환될 숫자값,string은 변환될 숫자가 저장될 버퍼,radix는 몇 진수 문자열의 형태로 저장할 지를 지정
예제-083.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
int value;
char string[100];
int radix;
radix = 10;
value = 5;
itoa(value, string, radix);
printf("변환된 문자열은 %s입니다.\n", string);
value = -12345;
itoa(value, string, radix);
printf("변환된 문자열은 %s입니다.\n", string);
}
084.정수를 문자열로 변환하기2 ltoa()
#include<stdlib.h>
char *ltoa(long value,char *string, int radix);
itoa()와 동일한 기능.
예제-084.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
int value;
char string[100];
int radix;
radix = 2;
value = 12345;
ltoa(value, string, radix);
printf("변환된 문자열은 %s입니다.\n", string);
value = -12345;
ltoa(value, string, radix);
printf("변환된 문자열은 %s입니다.\n", string);
}
085. 정수를 문자열로 변환하기3 ultoa()
#include <stlib.h>
char *ultoa(unsigned long value, char *string, int radix);
itoa()와 유사한 기능.
예제-085.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
int value;
char string[100];
int radix;
radix = 16;
value = 34567;
itoa(value, string, radix);
printf("변환된 문자열은 %s입니다.\n", string);
value = 1234567890;
itoa(value, string, radix);
printf("변환된 문자열은 %s입니다.\n", string);
}
086. 실수를 문자열로 변환하기1fcvt()
#include <stdlib.h>
charfcvt(double value, int count, int *dec,int *sign);
value는 변환될 실수값,count는 소수점 이하 몇 자리까지 문자열로 변환할 지를 지정
dec는 변환된 문자열의 몇 번째가 소수점의 위치인가를 표시(보통1)
sign은 0이면 양수값으로 변환,1이면 음수값으로변환
실수값을 문자열로 변환하여 내부적인 기억 공간에 별도로 저장하며, 그 별도로 저장된 공간의 메모리 주소를 반환
예제-086.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
double value;
char *pstr;
int dec, sign;
value = 3.1415926535;
pstr = fcvt(value, 6, &dec, &sign);
printf("변환된 문자열은 %s입니다.\n", pstr);
printf("소수점의 위치는 %d, 부호는 %d입니다.\n", dec, sign);
value = -3.1415926535;
pstr = fcvt(value, 8, &dec, &sign);
printf("변환된 문자열은 %s입니다.\n", pstr);
printf("소수점의 위치는 %d, 부호는 %d입니다.\n", dec, sign);
}
087.실수를 문자열로 변환하기2ecvt()
#include <stdlib.h>
char *ecvt(double value, int count, int *dec, int *sign);
value는지수가 포함된 실수값, count는 총몇 자리만큼의 문자열로 생성할 것인가를 지정
dec는 변환된 문자열의 몇 번째가 소수점의 위치인가를 표시(보통1)
sign은0이면 양수값, 1이면 음수값으로 변환
fcvt()와 동일하게 내부적인 공간을 사용하며, 그 공간의 메모리 주소를 반환
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
double value;
char *pstr;
int dec, sign;
value = 3.14e10;
pstr = ecvt(value, 3, &dec, &sign);
printf("변환된 문자열은 %s입니다.\n", pstr);
printf("소수점의 위치는 %d, 부호는 %d입니다.\n", dec, sign);
value = -3.14e10;
pstr = ecvt(value, 3, &dec, &sign);
printf("변환된 문자열은 %s입니다.\n", pstr);
printf("소수점의 위치는 %d, 부호는 %d입니다.\n", dec, sign);
}
fcvt()와 ecvt() 함수는 변환된 문자열을 기억하는 메모리를 공유하므로,
두함수를 연속적으로 사용하는 경우에 이전의 값이 바뀌어지므로 주의해야 한다.
088. 실수를 문자열로 변환하기3 gcvt()
#include <stdlib.h>
char*gcvt(double value, int digits, char*buffer);
value는 지수가 포함된 실수값,digits는 지수를 문자열로 변환 시몇 바이트를 의미 있는 숫자로 변환할 것인지를 지정
buffer는 변환된 value값이 저장됨
예제-088.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
double value;
char buffer[100];
value = 3.14e10;
gcvt(value, 3, buffer);
printf("변환된 문자열은 %s입니다.\n", buffer);
value = -3.14e10;
gcvt(value, 3, buffer);
printf("변환된 문자열은 %s입니다.\n", buffer);
}
ecvt()나fcvt() 함수와 달리, 소수점 및 부호를 생성한다. 따라서, 소수점의 위치 및 부호 값을 전달받는 포인터는 사용하지 않는다.
sprintf()함수를사용하면 실수를 문자열로 좀 더 편리하게 변환할 수 있다.
floatfFloat= 3.141592f;
double dDouble = 3.141592e+123;
char buffer[100];
sprintf(buffer, "%f\n", fFloat);
printf(buffer);// 3.141592
sprintf(buffer, "%e\n", dDouble);
printf(buffer); // 3.141592e+123
sprintf(buffer, "%g\n", dDouble);
printf(buffer); // 3.14159e+123
089. 문자가 알파벳인지 검사하기isalpha()
#include <ctype.h>
int isalpha(int c);
대소문자를 가리지 않는다.
예제-089.c
#include <stdio.h>
#include <ctype.h>
void main(void)
{
char *string = "Cat 1 Car 2 Cow 3...";
char buffer[100] = {0,};
int cnt = 0;
while(*string)
{
if(isalpha(*string))
{
buffer[cnt++] = *string;
}
string++;
}
puts(buffer);
}
090.문자가 숫자인지 검사하기 isdigit()
#include <ctype.h>
int isdigit(int c);
예제-090.c
#include <stdio.h>
#include <ctype.h>
void main(void)
{
char *string = "Cat 1 Car 2 Cow 3...";
char buffer[100] = {0,};
int cnt = 0;
while(*string)
{
if(isdigit(*string))
{
buffer[cnt++] = *string;
}
string++;
}
puts(buffer);
}
091.문자가 알파벳 또는 숫자인지 검사하기 isalnum()
#include<ctype.h>
int isalnum(int c);
예제-091.c
#include <stdio.h>
#include <ctype.h>
void main(void)
{
char *string = "Cat 1 Car 2 Cow 3...";
char buffer[100] = {0,};
int cnt = 0;
while(*string)
{
if(isalnum(*string))
{
buffer[cnt++] = *string;
}
string++;
}
puts(buffer);
}
092.문자가 대문자인지 검사하기 isupper()
#include <ctype.h>
int isupper(int c);
예제-092.c
#include <stdio.h>
#include <ctype.h>
void main(void)
{
char *string = "This is Korea!";
char buffer[100] = {0,};
int cnt = 0;
while(*string)
{
if(isupper(*string))
{
buffer[cnt++] = *string;
}
string++;
}
puts(buffer);
}
093.문자가 소문자인지 검사하기 islower()
#include <ctype.h>
int islower(intc);
예제-093.c
#include <stdio.h>
#include <ctype.h>
void main(void)
{
char *string = "This is Korea!";
char buffer[100] = {0,};
int cnt = 0;
while(*string)
{
if(islower(*string))
{
buffer[cnt++] = *string;
}
string++;
}
puts(buffer);
}
094.문자가 공백, 탭문자또는 개행문자인지 검사하기isspace()
#include <ctype.h>
int isspace(int c);
예제-094.c
#include <stdio.h>
#include <ctype.h>
void main(void)
{
char *string = "This is Korea!";
char buffer[100] = {0,};
int cnt = 0;
while(*string)
{
if(isspace(*string))
{
cnt++;
}
string++;
}
printf("공백, 탭 그리고 개행문자의 수는 %d입니다.\n", cnt);
}
isXXX로 시작하는 함수
isacii() : ch가 0부터 127까지의 표준 ASCII 문자라면 TRUE.
iscntrl(): ch가 제어 문자라면 TRUE.
isgraph() :ch가공백을 제외하고 인쇄 가능한 문자라면TRUE.
isprint() :ch가공백을 포함하여 인쇄 가능한 문자라면TRUE.
ispunct() :ch가구두점이라면TRUE.
isxdigit() : ch가 0부터 9까지의 숫자,a부터f까지의 문자,A부터F까지의 문자를 사용하는 16진수라면TRUE.
isspace() 함수는 문자열 좌우의 공백 등 필요 없는 문자를 제거하려 할 때 유용하다.
isspace() 함수를 사용하지 않고 공백/탭/개행문자를 검사하려면다음과 같이 작성하면 된다.
if(*string == ' '|| *string == '\t' ||*string== '\r'||*string =='\n')
095. 문자열에서 앞·뒤 2바이트씩 교환하기 swab()
#include <stdlib.h>
void swab(char *src,char *dest,int count);
src는 원본 문자열이며,dest는 바뀌어진 문자가 저장될 버퍼의 포인터,count는 바뀌어질 총 문자의 수
예제-095.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
char string1[] = "1a2b3c4d5e";
char string2[] = "..........";
puts(string1);
puts(string2);
swab(string1, string2, sizeof(string1)-1);
puts(string1);
puts(string2);
}
'C언어' 카테고리의 다른 글
Chapter 6. scanf()와 fgets() (0) | 2011.10.16 |
---|---|
Chapter 2. 1차원 배열과 포인터 (0) | 2011.10.16 |
Chapter 3. 2차원 배열과 포인터 (0) | 2011.10.16 |
실행결과 (0) | 2011.10.16 |
Chapter 1. 포인터의 기초 (0) | 2011.10.16 |