051. 문자 입력받기 (getch)
• 소스
#include <stdio.h>
//#include <conio.h> // macOS에서는 호환 X
#include <termios.h>
#include <unistd.h>
#define ENTER 10 // macOS에서는 Enter 키가 '\n' → ASCII 10 (Window는 13)
// getch() 대체 함수 정의
char getch(void)
{
struct termios oldt, newt;
char ch;
// 현재 터미널 설정 저장
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
// 입력 버퍼 없이, 에코 없이 입력 받기 설정
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
// 문자 1개 읽기
read(STDIN_FILENO, &ch, 1);
// 터미널 설정 복원
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}
int main(void)
{
int ch;
printf("아스키 코드로 변환할 키를 누르세요...\n");
printf("Enter 키를 누르면 프로그램은 종료됩니다.\n");
do
{
ch = getch();
printf("문자:(%c), 아스키 코드 = (%d)\n", ch, ch);
} while (ch != ENTER);
return 0;
}
• 설명
#include <conio.h>와 getch()가 Windows 전용 함수이기 때문에, 예제 코드 변환 및 gerch()는 직접 정의.
getch()를 이용해 한 개의 문자를 입력 받아 출력
• 결과 화면

052. 문자 출력하기 (putch)
• 소스
#include <stdio.h>
//include <conio.h> // macOS에서는 호환 X
int print(char *string);
int main(void)
{
print("This is a putchar function!");
}
int print(char *string)
{
int len = 0;
while (*string != '\0') // NULL은 포인터, 문자열 끝은 '\0'
{
putchar(*string); // putch() 대신 putchar() 사용
string++;
len++;
}
// 줄 바꿈
putchar('\n'); // 캐리지 리턴은 필요 없음 (macOS 터미널에서는 \n만으로 줄바꿈 가능)
return len;
}
• 설명
#include <conio.h>와 putch()가 Windows 전용 함수이기 떄문에 대신 putchar()로 대체
print() 함수를 정의해 문자를 출력한다.
• 결과 화면

053. 정수값 입력받기 (scanf)
• 소스
#include <stdio.h>
int main(void) // main은 int형으로 정의하는 게 표준입니다.
{
int count; // 3회를 카운트하기 위한 변수
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);
}
• 설명
scanf()를 사용하여 정수값을 읽는데, 정수값을 읽기 위한 tmp 변수는 값이 아닌 번지를 넘겨준다.
• 결과 화면

054. 정수값 출력하기 (printf)
• 소스
#include <stdio.h>
int main() {
int a = 300, b = 3000, c = 12345;
// 정렬을 사용하지 않는 경우
printf("[%d] \n", a); //[300]
printf("[%d] \n", b); //[3000]
printf("[%d] \n", c); //[12345]
// 출력을 5자리 설정
printf("[%5d] \n", a); //[ 300]
printf("[%5d] \n", b); //[ 3000]
printf("[%5d] \n", c); //[12345]
// 출력을 10자리 설정
printf("[%10d] \n", a); //[ 300]
printf("[%10d] \n", b); //[ 3000]
printf("[%10d] \n", c); //[ 12345]
// 출력을 10자리로 설정하고 왼쪽 정렬
printf("[%-10d] \n", a); //[300 ]
printf("[%-10d] \n", b); //[3000 ]
printf("[%-10d] \n", c); //[12345 ]
}
• 설명
printf() 함수를 사용하여 숫자 값 출력 시 좌우 정렬 및 길이를 설정이 가능하다.
• 결과 화면

055. 문자열 입력받기 (gets)
• 소스
#include <stdio.h>
int count(char *str);
int main()
{
char string[100];
char *ret;
// 안전하게 문자열 입력받기
ret = fgets(string, sizeof(string), stdin);
if(ret != NULL)
{
printf("문자 'a'의 갯수는 %d개입니다.\n", count(string));
}
return 0;
}
int count(char *str)
{
int cnt = 0;
// 문자열 끝은 '\0'으로 비교해야 함
while (*str != '\0')
{
if (*str++ == 'a') cnt++;
}
return cnt;
}
• 설명
gets()는 버퍼 오버플로우 때문에 C11 표준부터 제거됨.
대신 fgets() 함수를 사용하여 대체가 가능하다.
항목 | gets() | fgets() |
버퍼 길이 | 제한 없음(위험) | 길이 제한 가능(안전) |
개행 문자 | 자동 제거 안됨 | 개행 포함됨 (\n) |
C 표준 | C11부터 제거 | 계속 사용 가능 |
• 결과 화면

056. 문자열 출력하기 (puts)
• 소스
#include <stdio.h>
# define JAPAN "일본"
# define WINTER "겨울"
int main()
{
const char* summer = "여름";
puts(JAPAN);
puts(WINTER);
puts(summer);
}
• 설명
인수로 넘겨주는 문자열은 puts() 함수 내부적으로 문자열 상수(constant)처럼 사용되기 떄문에, puts() 함수 실행 후에도 변하지 않는다.
• 결과 화면

057. 문자열 복사하기 (strcpy)
• 소스
#include <stdio.h>
#include <string.h>
# define JAPAN "일본"
int main()
{
char *string1;
char string2[100];
strcpy(string1, JAPAN); // 실행 시 에러 발생
strcpy(string2, JAPAN);
strcpy(string2, "겨울");
}
• 설명
char *string1; : 문자형 포인트 변수 string1를 정의함
strcpy(string1, JAPAN); : string1은 어디를 정의만 했고 초기화를 하지 않았다.
즉, string1은 어디를 가리키고 있는지 알 수 없는 쓰레기값(null 또는 무작위 주소) 상태이고,
그런 곳에 strcpy()로 데이터를 복사하려 하면, 시스템이 "접근 금지 영역에 쓰기 시도"로 에러를 낸다.
• 결과 화면

058. 문자열을 복사하는 함수 만들기
• 소스
#include <stdio.h>
# define JAPAN "일본"
char* MY_strcpy(char* dest, const char* src);
int main()
{
char string[100];
MY_strcpy(string, JAPAN);
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++!=NULL);
return dest;
}
• 설명
strcpy() 함수의 내부적인 흐름은 전체 문자열을 다른 메모리 영역으로 복사한다.
• 결과 화면

059. 문자열을 대•소문자로 구분하여 비교하기 (stcmp)
• 소스
#include <stdio.h>
#include <string.h>
# define SKY "sky"
int main()
{
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);
}
• 설명
strcmp() 함수는 입력 받은 문자를 비교한다.
모든 문자열이 일치할 경우에는 0을 반환하지만, 다를 경우에는 정확한 아스키 차이값을 반환합니다.
교재의 설명은 -1, 0, 1로 표현하지만 실제로는 차이값이 반환됩니다.
• 결과 화면

060. 문자열을 비교하는 함수 만들기
• 소스
#include <stdio.h>
# define SKY "sky"
int MY_strcmp(const char* string1, const char* string2);
int main()
{
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; //36번째 줄로 이동
}
if(*string1<*string2) return -1;
else return 1;
}
if(*string2!=(int)NULL) return -1;
return 0;
}
• 설명
strcmp() 함수는 입력 받은 문자를 비교한다.
모든 문자열이 일치할 경우에는 0을 반환하지만, 다를 경우에는 정확한 아스키 차이값을 반환합니다.
strcmp() 함수와 유사한 문자열을 비교하는 함수를 만드는데,
모든 문자열이 일치할 경우에는 0을 반환하고, string1 값이 작다면 -1, 크다면 1을 반환한다.
• 결과 화면

061. 문자열을 일정 크기만큼 비교하기 (strncmp)
• 소스
#include <stdio.h>
#include <string.h>
# define SKY "sky"
int main()
{
char string[100];
int ret;
printf("영단어를 입력한 후 Enter키를 입력하세요!\n");
printf("sky를 입력하면 프로그램이 종료됩니다.\n");
do
{
gets(string);
ret = strncmp(string,SKY,3); // 3바이트 길이의 문자열을 비교
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);
}
• 설명
strncmp()함수는 strcmp() 함수와 동일하게 입력 받은 문자를 비교하지만,
비교할 바이트 수를 받아 비교한다.
• 결과 화면

062. 문자열 연결하기 (strcat)
• 소스
#include <stdio.h>
#include <string.h>
int main()
{
char string1[100];
char string2[200];
printf("첫 번째 단어를 입력하세요!\n");
gets(string1);
printf("두 번째 단어를 입력하세요!\n");
gets(string2);
strcat(string1, string2);
puts(string1);
}
• 설명
strcat()은 문자열과 문자열을 서로 연결시킨다.
strncat()은 문자열 결합은 수행하지만, 원본 문자열에서 목적 문자열의 마지막에 추가되는 문자의 개수를 지정할 수 있게 해준다.
• 결과 화면

063. 문자열의 길이 구하기 (strlen)
• 소스
#include <stdio.h>
#include <string.h>
int main()
{
char string[200];
printf("문장을 입력한 후, Enter 키를 치세요!\n");
printf("아무것도 입력하지 않으면 프로그램은 종료됩니다!\n");
do
{
gets(string);
if(strlen(string)==0)
{
break;
}
printf("문자열의 길이는 %d입니다.\n",strlen(string));
} while (1);
}
• 설명
strlen() 함수는 문자열의 길이를 구해주며, 문자열의 길이를 출력한다.
• 결과 화면

064. 문자열 검색하기 (strstr)
• 소스
#include <stdio.h>
#include <string.h>
#define SKY "sky"
int main()
{
char string[100];
char *ret;
printf("문장을 입력한 후, Enter 키를 치세요!\n");
printf("문자열 중에 sky가 포함되어 있으면 프로그램은 종료됩니다!\n");
do
{
gets(string);
ret = strstr(string,SKY);
if(ret==NULL)
{
puts("문자열 중에 sky가 없습니다.");
}
else
{
printf("%d 위치에서 sky 문자열을 찾았습니다.",ret - string);
break;
}
} while (1);
}
• 설명
strstr() 함수는 문자열뿐만 아니라, 단일 문자(예를 들어, 'e')도 검색할 수 있다.
단일 문자를 검색하려면 문자가 아닌 문자열로 표현해야한다.
예) ret = strstr(string,"e")
• 결과 화면

065. 문자열 중에서 문자 검색하기 (strchr)
• 소스
#include <stdio.h>
#include <string.h>
#define FIND_CHAR 'h'
int main()
{
char string[100];
char *ret;
puts("문장을 입력한 후, Enter 키를 치세요!\n");
puts("문자열 중에 'h'가 포함되어 있으면 프로그램은 종료됩니다!\n");
do
{
gets(string);
ret = strchr(string,FIND_CHAR);
if(ret==NULL)
{
puts("문자열 중에 'h'가 없습니다.");
}
else
{
printf("%d 위치에서 'h' 문자열을 찾았습니다.",ret - string);
break;
}
} while (1);
}
• 설명
strchr() 함수는 문자열의 앞에서부터 검색이 가능하며,
strrchr() 함수는 문자열의 뒤에서부터 검색이 가능하다.
• 결과 화면

066. 문자열 중에서 일치되는 첫 문자의 위치 구하기(strcspn)
• 소스
#include <stdio.h>
#include <string.h>
int main()
{
char *string = "This is a string $$$";
char *strCharSet = "~!@#$%^&&*()_+={}[]:;'<>./?";
unsigned int pos;
pos = strcspn(string, strCharSet);
puts("0 1 2 3");
puts("012345678900123456789001234567890");
puts(string);
puts(strCharSet);
printf("%d 위치에서 일치되는 첫 문자를 발견하였습니다.\n",pos);
}
• 설명
strcspn() 함수는 문자세트 중에서 하나의 문자라도 일치한다면 그 위츠를 반환하여 주며,
일치되는 문자가 없으면 문자열의 길이가 반환된다.
• 결과 화면

067. 문자열의 중에서 일치되지 않는 첫 문자의 위치 구하기 (strspn)
• 소스
#include <stdio.h>
#include <string.h>
int main()
{
char *string = "this is a very good !";
char *strCharSet = "abcdefghijklmnopqrstuvwxyz "; // 주의: 공백 포함
unsigned int pos;
pos = strspn(string, strCharSet);
puts("0 1 2 3");
puts("012345678900123456789001234567890");
puts(string);
puts(strCharSet);
printf("%d 위치에서 일치되지 않는 문자를 발견하였습니다.\n",pos);
}
• 설명
strspn() 함수는 문자세트 중에서 하나의 문자라도 일치하지 않는다면 그 위치를 반환하여 주며, 모든 문자가 일치되면 문자열의 길이가 반환된다.
• 결과 화면

068. 문자열을 구분자로 분리하기1 (strtok)
• 소스
#include <stdio.h>
#include <string.h>
#define TOKEN " "
int main()
{
char string[100];
char *token;
puts("문자열을 입력한 후 Enter키를 치세요!");
gets(string);
token = strtok(string, TOKEN);
while (token!=NULL)
{
puts(token);
token = strtok(NULL,TOKEN);
}
}
• 설명
strtok() 함수는 TOKEN을 구분자로 입력받은 string을 분리해준다.
• 결과 화면

069. 문자열을 구분자로 분리하기2 (strpbrk)
• 소스
#include <stdio.h>
#include <string.h>
#define TOKEN " "
int main()
{
char string[100];
char *pos;
puts("문자열을 입력한 후 Enter키를 치세요!");
gets(string);
pos = strpbrk(string, TOKEN);
while (pos!=NULL)
{
puts(pos++);
pos = strpbrk(pos,TOKEN);
}
}
• 설명
strpbrk() 함수는 strtok() 함수와 비슷하게 TOKEN을 구분자로 입력받은 string을 분리해준다.
• 결과 화면

070. 문자열을 특정 문자로 채우기 (strset)
• 소스
#include <stdio.h>
#include <string.h>
void my_strset(char *str, char ch); // my_strset() 선언
int main()
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(strlen(string)==0) break;
my_strset(string,string[0]);
puts(string);
} while (1);
}
// macOS에서는 strset()함수는 컴파일 에러가 발생해서 직접 구현
void my_strset(char *str, char ch)
{
while (*str)
{
*str = ch;
str++;
}
}
• 설명
strset() 함수는 채울 버퍼와 채울 문자를 받아 문자를 채워준다.
macOS에서는 컴파일 에러로 인해 직접 구현하여서 사용.
• 결과 화면

071. 부분 문자열을 특정 문자로 채우기 (strnset)
• 소스
#include <stdio.h>
#include <string.h>
void my_strnset(char *str, char ch, size_t n); // my_strnset() 선언
int main()
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(strlen(string)==0) break;
my_strnset(string,'*',5);
puts(string);
} while (1);
}
// macOS에서는 strnset()함수는 컴파일 에러가 발생해서 직접 구현
void my_strnset(char *str, char ch, size_t n)
{
while (*str && n--)
{
*str++ = ch;
}
}
• 설명
strnset() 함수는 채울 버퍼와 채울 문자와 채울 문자의 수를 받아 문자를 채워준다.
macOS에서는 컴파일 에러로 인해 직접 구현하여서 사용.
• 결과 화면

072. 문자열을 대문자로 변환하기 (strupr)
• 소스
#include <stdio.h>
#include <string.h>
void my_strupr(char *str); // my_strupr() 선언
int main()
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(strlen(string)==0) break;
my_strupr(string);
puts(string);
} while (1);
}
// macOS에서는 strupr()함수는 컴파일 에러가 발생해서 직접 구현
void my_strupr(char *str) {
while (*str) {
if (*str >= 'a' && *str <= 'z') {
*str -= 32;
}
str++;
}
}
• 설명
strupr() 함수는 대문자로 변환될 문자 버퍼를 받아 대문자로 변환해준다.
macOS에서는 컴파일 에러로 인해 직접 구현하여서 사용.
• 결과 화면

073. 문자열을 소문자로 변환하기 (strlwr)
• 소스
#include <stdio.h>
#include <string.h>
void my_strlwr(char *str); // my_strlwr() 선언
int main()
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(strlen(string)==0) break;
my_strlwr(string);
puts(string);
} while (1);
}
// macOS에서는 strlwr()함수는 컴파일 에러가 발생해서 직접 구현
void my_strlwr(char *str) {
while (*str)
{
if (*str >= 'A' && *str <= 'Z')
*str = *str - 'A' + 'a';
str++;
}
}
• 설명
strlwr() 함수는 대문자로 변환될 문자 버퍼를 받아 소문자로 변환해준다.
macOS에서는 컴파일 에러로 인해 직접 구현하여서 사용.
• 결과 화면

074. 문자열을 거꾸로 뒤집기 (strrev)
• 소스
#include <stdio.h>
#include <string.h>
void my_strrev(char *str); // my_strrev() 선언
int main()
{
char string[100];
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(strlen(string)==0) break;
my_strrev(string);
puts(string);
} while (1);
}
// macOS에서는 strrev()함수는 컴파일 에러가 발생해서 직접 구현
void my_strrev(char *str) {
int left = 0;
int right = strlen(str) - 1;
char temp;
while (left < right)
{
temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
}
• 설명
strrev() 함수는 거꾸로 뒤집혀질 문자 버퍼를 받아 문자를 거꾸로 뒤집어 변환해준다.
macOS에서는 컴파일 에러로 인해 직접 구현하여서 사용.
• 결과 화면

075. 문자열을 중복 생성하기 (strdup)
• 소스
#include <stdio.h>
#include <string.h>
// #include <malloc.h> // macOS에서는 지원하지 않아 컴파일 에러 발생
#include <stdlib.h> // malloc.h 대체
int main()
{
char string[100];
char *pstr;
puts("문자열을 입력한 후 Enter키를 치세요!");
puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다!");
do
{
gets(string);
if(strlen(string)==0) break;
pstr = strdup(string);
strcpy(string,"temporary string");
printf("문자열 string:%s\n",string);
printf("문자열 pstr: %s\n",pstr);
free(pstr);
} while (1);
}
• 설명
strdup() 함수는 입력한 문자열을 복제합니다.
내부적으로 메모리를 할당하는 malloc() 함수를 사용한다.
malloc() 함수를 사용하기 위해서는 malloc.h 헤더를 사용해야 하지만, macOS에서 지원하지 않아 stdlib.h 헤더를 사용
• 결과 화면

076. 문자열을 형식화하기 (sprintf)
• 소스
#include <stdio.h>
int main()
{
char cValue = 'a';
char 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);
}
• 설명
sprintf() 함수는 printf() 함수와 사용 방법이 같다.
단지 printf() 함수는 화면에 출력할 때 사용하며, sprintf() 함수는 버퍼에 형식화된 문자열을 생성할 때 사용한다.
• 결과 화면

077. 문자열을 정수로 변환하기1 (atoi)
• 소스
#include <stdio.h>
#include <stdlib.h>
int main()
{
int count; // 3회를 카운트하기 위한 변수
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);
}
• 설명
atoi() 함수는 입력된 문자열을 숫자로 변환해준다.
변환 가능한 문자열은 공백, 탭, 기호(+,-) 그리고 숫자뿐이다.
• 결과 화면

078. 문자열을 정수로 변환하기2 (atol)
• 소스
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *string1 = "2는 1보다 큽니다.";
char *string2 = "1004는 천사입니다.";
char *string3 = "2052년도 입니다.";
char *string4 = "오늘은 6월 29일입니다.";
long t1, t2, t3, t4;
puts(string1);
puts(string2);
puts(string3);
puts(string4);
t1 = atol(string1);
t2 = atol(string2);
t3 = atol(string3);
t4 = atol(string4);
printf("문자열을 숫자로 변환한 값: %ld, %ld, %ld, %ld \n",t1,t2,t3,t4);
printf("총 합은 %d입니다.\n",t1+t2+t3+t4);
}
• 설명
atol() 함수는 입력된 문자열을 숫자로 변환해준다. atoi() 함수와 사용법이 동일하다.
변환 가능한 문자열은 공백, 탭, 기호(+,-) 그리고 숫자뿐이다.
• 결과 화면

079. 문자열을 정수로 변환하기3 (strtol)
• 소스
#include <stdio.h>
#include <stdlib.h>
int main()
{
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);
}
• 설명
strtol() 함수는 atoi() 또는 atol() 함수와 달리, 기수라는 것이 존재한다.
기수라는 것은 10진수, 2진수, 8진수, 16진수 등과 같이 각 진수의 기본이 되는 수이다.
보통은 10진수를 사용하지만, 프로그래밍을 하다 보면 16진수 또는 2진수를 종종 사용하기 떄문에,
16진수로 구성된 문자열을 숫자로 변환하기 위해서는 radix를 16으로 설정해야 하며,
2진수로 구성된 문자열을 숫자로 변환하려면 radix를 2로 설정해야한다.
• 결과 화면

080. 문자열을 정수로 변환하기4 (strtoul)
• 소스
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *string = "11000";
char *stop;
int radix;
unsigned long value;
radix = 2;
value = strtoul(string, &stop, radix);
printf("%d개의 문자가 변환되었습니다.\n",stop - string);
printf("2진수 %s를 숫자로 변환하면 %ld입니다.\n",string, value);
}
• 설명
strtoul() 함수는 strtol() 함수와 사용법이 같으며, 단지 반환값이 unsigned long 형이라는 점이 다르다.
• 결과 화면

081. 문자열을 실수로 변환하기 1 (atof)
• 소스
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *string1 = "2.1은 1.0보다 큽니다.";
char *string2 = "1004.5는 천사.오입니다.";
char *string3 = "2052년도 입니다.";
char *string4 = "오늘은 6월 29일 입니다.";
double t1, t2, t3, t4;
puts(string1);
puts(string2);
puts(string3);
puts(string4);
t1 = atof(string1);
t2 = atof(string2);
t3 = atof(string3);
t4 = atof(string4);
printf("문자열을 숫자로 변환한 값: %.1f, %.1f, %.1f, %.1f \n",t1,t2,t3,t4);
printf("총 합은 %.2f입니다.\n",t1+t2+t3+t4);
}
• 설명
atof() 함수는 소수점을 포함하고 있는 문자열을 받아서 숫자로 변환해준다.
변환 가능한 문자열은 공백, 탭, 기호(+,-), 숫자, 소수점 그리고 지수(d,D,e,E)뿐이다.
• 결과 화면

082. 문자열을 실수로 변환하기2 (strtod)
• 소스
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *string = "1.234E-10";
char *stop;
double value;
value = strtod(string,&stop);
printf("%d개의 문자가 변환되었습니다.\n",stop-string);
printf("문자열 [%s]를 숫자로 변환하면 %E입니다.\n",string,value);
}
• 설명
strtod() 함수는 지수가 포함된 문자열을 실수로 변환해준다.
• 결과 화면

083. 정수를 문자열로 변환하기1 (itoa)
• 소스
#include <stdio.h>
#include <stdlib.h>
void my_itoa(int value, char *str, int radix); // my_itoa 선언
int main()
{
int value;
char string[100];
int radix;
radix = 10; // 10진수
value = 5;
my_itoa(value,string,radix);
printf("변환된 문자열은 %s입니다.\n",string);
value = -12345;
my_itoa(value,string,radix);
printf("변환된 문자열은 %s입니다.\n",string);
}
// macOS에서는 itoa()함수는 컴파일 에러가 발생해서 직접 구현
void my_itoa(int value, char *str, int radix) {
if (radix == 10) {
sprintf(str, "%d", value); // 10진수만 지원하는 간단 구현
}
// 필요하면 2진수, 16진수 등도 추가 구현 가능
}
• 설명
itoa() 함수는 변환될 숫자값과 변환될 숫자가 저장될 버퍼, 변환될 숫자값을 몇 진수 문자열의 형태로 저장하는 값을 받아서 문자열로 변환해준다.
macOS에서는 컴파일 에러로 인해 직접 구현하여서 사용.
• 결과 화면

084. 정수를 문자열로 변환하기2 (itoa)
• 소스
#include <stdio.h>
#include <stdlib.h>
void my_itoa(int value, char *str, int radix); // my_itoa 선언
int main()
{
long value;
char string[100];
int radix;
radix = 2; // 2진수
value = 12345;
my_itoa(value,string,radix);
printf("변환된 문자열은 %s입니다.\n",string);
value = -12345;
my_itoa(value,string,radix);
printf("변환된 문자열은 %s입니다.\n",string);
}
// macOS에서는 itoa()함수는 컴파일 에러가 발생해서 직접 구현
void my_itoa(int value, char *str, int radix) {
char buffer[65];
const char digits[] = "0123456789ABCDEF";
int i = 0;
int is_negative = 0;
// 10진수 음수는 부호로 처리
if (value < 0 && radix == 10) {
is_negative = 1;
value = -value;
}
// 2, 8, 16진수에서는 음수를 2의 보수로 출력
unsigned int uvalue = (radix == 10) ? value : (unsigned int)value;
if (uvalue == 0) {
buffer[i++] = '0';
}
while (uvalue > 0) {
buffer[i++] = digits[uvalue % radix];
uvalue /= radix;
}
if (is_negative) buffer[i++] = '-';
buffer[i] = '\0';
// 역순 복사
for (int j = 0; j < i; j++) {
str[j] = buffer[i - j - 1];
}
str[i] = '\0';
}
• 설명
itoa() 함수는 변환될 숫자값과 변환될 숫자가 저장될 버퍼, 변환될 숫자값을 몇 진수 문자열의 형태로 저장하는 값을 받아서 문자열로 변환해준다.
macOS에서는 컴파일 에러로 인해 직접 구현하여서 사용.
• 결과 화면

085. 정수를 문자열로 변환하기3 (_ultoa)
• 소스
#include <stdio.h>
#include <stdlib.h>
void my_ultoa(unsigned int value, char *str, int radix); // my_ultoa 선언
int main()
{
unsigned value;
char string[100];
int radix;
radix = 16; // 2진수
value = 34567;
my_ultoa(value,string,radix);
printf("변환된 문자열은 %s입니다.\n",string);
value = 1234567890;
my_ultoa(value,string,radix);
printf("변환된 문자열은 %s입니다.\n",string);
}
// macOS에서는 ultoa()함수는 컴파일 에러가 발생해서 직접 구현
void my_ultoa(unsigned int value, char *str, int radix) {
const char *digits = "0123456789ABCDEF";
char buffer[65];
int i = 0;
if (value == 0) {
buffer[i++] = '0';
} else {
while (value > 0) {
buffer[i++] = digits[value % radix];
value /= radix;
}
}
// 역순 복사
for (int j = 0; j < i; j++) {
str[j] = buffer[i - j - 1];
}
str[i] = '\0';
}
• 설명
_ultsazxxoa() 함수는 변환될 숫자값과 변환될 숫자가 저장될 버퍼, 변환될 숫자값을 몇 진수 문자열의 형태로 저장하는 값을 받아서 문자열로 변환해준다.
macOS에서는 컴파일 에러로 인해 직접 구현하여서 사용.
• 결과 화면

086. 실수를 문자열로 변환하기1 (fcvt)
• 소스
#include <stdio.h>
#include <stdlib.h>
int main()
{
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);
}
• 설명
fcvt() 함수는 변환될 실수값, 소수점 이하 몇 자리까지 문자열로 변활할 지, 변환된 문자열의 몇 번째가 소수점의 위치인가를 표시, 부호를 지정하여 실수값을 문자열로 변환하여 내부적인 기억 공간에 별도로 저장하며, 그 별도로 저장된 공간의 메모리 주소를 반환함.
• 결과 화면

087. 실수를 문자열로 변환하기2 (ecvt)
• 소스
#include <stdio.h>
#include <stdlib.h>
int main()
{
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);
}
• 설명
ecvt() 함수는 지수가 포함된 실수값, 총 몇 자리까지 문자열로 생성할 지, 변환된 문자열의 몇 번째가 소수점의 위치인가를 표시, 부호를 지정하여 실수를 문자열로 변환하며 fcvt() 함수와 마찬가지로 내부적인 기억공간을 별도로 사용하며, 그 메모리에 대한 포인터(번지)만 반환한다.
• 결과 화면

088. 실수를 문자열로 변환하기3 (gvct)
• 소스
#include <stdio.h>
#include <stdlib.h>
int main()
{
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);
}
• 설명
gvct() 함수는 지수가 포함된 실수값, 지수를 문자열로 변환 시 몇 바이트로 변환하는지, 변환되어 저장될 문자 배열 버퍼를 지정하여 실수값을 변환하여 문자 배열 버퍼에 저장한다.
• 결과 화면

089. 문자가 알파벳인지 검사하기 (isalpha)
• 소스
#include <stdio.h>
#include <ctype.h>
int main()
{
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);
}
• 설명
isalpha() 함수는 비교할 문자값을 받아 string이 가리키는 번지의 값이 대문자(A~Z) 또는 소문자(a~z) 범위에 있는 경우 1(참)을 반환하며, 그렇지 않은 경우 0(거짓)을 반환한다.
• 결과 화면

090. 문자가 숫자인지 검사하기 (isdigit)
• 소스
#include <stdio.h>
#include <ctype.h>
int main()
{
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);
}
• 설명
isdigit() 함수는 비교할 문자값을 받아 string이 가리키는 번지의 값이 숫자(0~9)인 경우에 1(참)을 반환한다.
• 결과 화면

091. 문자가 알파벳 또는 숫자인지 검사하기 (isalnum)
• 소스
#include <stdio.h>
#include <ctype.h>
int main()
{
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);
}
• 설명
isalnum() 함수는 비교할 문자값을 받아 string이 가리키는 번지의 값이 대문자(A~Z), 소문자(a~z) 또는 숫자(0~9)인 경우에 1(참)을 반환한다.
• 결과 화면

092. 문자가 대문자인지 검사하기 (isupper)
• 소스
#include <stdio.h>
#include <ctype.h>
int main()
{
char *string = "This is Korea!";
char buffer[100] = {0,};
int cnt = 0;
while (*string)
{
if(isupper(*string))
{
buffer[cnt++] = *string;
}
string++;
}
puts(buffer);
}
• 설명
isupper() 함수는 비교할 문자값을 받아 string이 가리키는 번지의 값이 대문자(A~Z)인 경우에 1(참)을 반환한다.
• 결과 화면

093. 문자가 소문자인지 검사하기 (islower)
• 소스
#include <stdio.h>
#include <ctype.h>
int main()
{
char *string = "This is Korea!";
char buffer[100] = {0,};
int cnt = 0;
while (*string)
{
if(islower(*string))
{
buffer[cnt++] = *string;
}
string++;
}
puts(buffer);
}
• 설명
islower() 함수는 비교할 문자값을 받아 string이 가리키는 번지의 값이 대문자(A~Z)인 경우에 1(참)을 반환한다.
• 결과 화면

094. 문자가 공백, 탭문자 또는 개행문자인지 검사하기 (isspace)
• 소스
#include <stdio.h>
#include <ctype.h>
int main()
{
char *string = "This is Korea!\t\n";
int cnt = 0;
while (*string)
{
if(isspace(*string))
{
cnt++;
}
string++;
}
printf("공백, 탭 그리고 개행문자의 수는 %d입니다.",cnt);
}
• 설명
isspace() 함수는 비교할 문자값을 받아 string이 가리키는 번지의 값이 공백, 탭 또는 개행문자인 경우에 1(참)을 반환한다.
• 결과 화면

095. 문자열에서 앞•뒤 2바이트씩 교환하기 (swab)
• 소스
#include <stdio.h>
// include <stdlib.h> // macOS에서는 swab()이 unistd.h에 정의되어 있음
#include <unistd.h>
int main()
{
char string1[] = "1a2b3c4d5e";
char string2[] = "1a2b3c4d5e";
puts(string1);
puts(string2);
swab(string1, string2, sizeof(string1)-1);
puts(string1);
puts(string2);
}
• 설명
swab() 함수는 원본 문자열, 바뀌어진 문자가 저장될 버퍼의 포인터, 바뀌어질 총 문자의 수를 지정하여 문자열을 2바이트씩 잘라서 앞뒤로 교체한다.
• 결과 화면

이 글은 초보자를 위한 C언어 300제 (김은철 지음, 정보문화사)을 참고하여 작성했습니다.
'C' 카테고리의 다른 글
[C] C언어 300제 - 중급(3) (0) | 2025.06.25 |
---|---|
[C] C언어 300제 - 중급(2) (2) | 2025.06.24 |
[C] C언어 300제 - 초급 (0) | 2025.06.19 |
[C] C언어 300제 - 입문 (0) | 2025.06.19 |
[C] Mac(M1) Visual Studio Code C/C++ 개발환경 세팅 (1) | 2025.06.19 |