#include <stdlib.h>
문자열을 정수로 변환하기
-atoi(문자열); //ASCII string to integer
특정 진법으로 표기된 문자열을 정수로 변환하기
-strtol(문자열, 끝포인터, 진법); //string to long
문자열을 실수로 변환하기
-atof(문자열); // ASCII string to float
정수를 문자열로 변환하기 (stdio.h)
-sprintf(문자열,"%d",정수);
-sprintf(문자열,"%x",정수);
-sprintf(문자열,"%X",정수);
실수를 문자열로 변환하기
-sprintf(문자열,"%f", 실수);
여러 개의 실수로 된 문자열을 실수로 바꾸기
-strtof(문자열, 끝포인터); //string to float
프로그램을 만들다보면 내용은 숫자지만 형태는 문자열인 경우를 자주 만나게 됨. 예를 들면 다음과 같이 텍스트 파일에 문자와 숫자가 섞인 상태로 저장될 수 있음.
예) Hello, world!, 10, 35.28
이 문자열을 int, float형으로 변환하거나 int, float형 숫자를 문자열로 변환할 수 있음.
46.1 문자열을 정수로 변환하기
atoi 함수를 사용하면 10진법으로 표기된 문자열을 정수로 바꿀 수 있음. 함수 이름은 ASCII string to integer에서 따옴. (stdlib.h 헤더파일)
atoi(문자열);
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* s1 = "283"; // "283"은 문자열
int num1;
num1 = atoi(s1); //문자열을 정수로 변환하여 num1에 할당
printf("%d\n", num1); //283
return 0;
}
atoi 함수에 문자열을 넣어주면 정수가 반환됨. 단, 문자열은 정수로 되어있어야 하며 알파벳 영문자, 특수 문자가 포함되면 해당 문자부터는 변환을 하지 않음. 또한 처음부터 숫자가 아니면 0으로 변화됨.
283a → 283
283a30 → 283
283! → 283
283!30 → 283
a30 → 0
!30 → 0
abc → 0
!@# → 0
46.2 특정 진법으로 표기된 문자열을 정수로 변환하기
strtol 함수를 사용하면 16진법으로 표기된 문자열을 정수로 바꿀 수 있으며 함수 이름은 string to long에서 따옴.(stdlib.h 헤더 파일에 선언되어 있음)
strtol(문자열, 끝포인터, 진법);
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* s1 = "0xaf10"; //"0xaf10"은 문자열
int num1;
num1 = strtol(s1, NULL, 16); //16진법으로 표기된 문자열을 정수로 변환
printf("%x %d\n", num1, num1); //af10 44816
return 0;
}
strol 함수의 두 번째 인수(끝 포인터)에 NULL을 넣었는데 이 부분은 여러 개의 정수로 된 문자열을 변환할 때 사용함.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* s1 = "0xaf10 42 0x27c 9952"; //"0xaf10"은 문자열
int num1;
int num2;
int num3;
int num4;
char* end; //이전 숫자의 끝 부분을 저장하기 위한 포인터
num1 = strtol(s1, &end, 16); //16진법으로 표기된 문자열을 정수로 변환
num2 = strtol(end, &end, 10); //10진법으로 표기된 문자열을 정수로 변환
num3 = strtol(end, &end, 16);
num4 = strtol(end, NULL, 10);
printf("%x\n", num1); //af10
printf("%d\n", num2); //42
printf("%x\n", num3); //27c
printf("%d\n", num4); //9952
return 0;
}
처음에는 num1 = strtol(s1, &end, 16);와 같이 s1의 첫 부분을 정수로 변환함. 여기서 끝 포인터는 &end처럼 end의 메모리 주소를 넣어줌. 이렇게 하면 strtol 함수가 실행된 뒤에는 끝 포인터가 " 42 0x27C 9952"처럼 이전 숫자의 끝 부분부터 시작하게 됨.
두 번째부터는 num2 = strtol(end, &end, 10);와 같이 end를 넣어주어 이전 숫자의 끝 부분부터 변환하면 됨. 더 변환할 문자열이 없다면 num4 = strtol(end, NULL, 10);와 같이 NULL을 넣어주면 됨.
46.3 문자열을 실수로 변환하기
atof 함수를 사용하면 문자열을 실수로 바꿀 수 있으며 함수 이름은 ASCII string to float에서 따옴. (stdlib.h 헤더 파일에 선언되어 있음)
atof(문자열);
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* s1 = "35.283672"; // "35.283672"는 문자열
float num1;
num1 = atof(s1); //문자열을 실수로 변환하여 num1에 할당
printf("%f\n", num1); //35.283672
return 0;
}
문자열은 실수로 되어있어야하며 알파벳 영문자, 특수문자가 포함되면 해당 문자부터는 변환을 하지 않음. 또한 처음부터 숫자가 아니면 0으로 변화됨.
35.283672f → 35.283672
35.2836f72 → 35.283600
35.283672! → 35.283672
35.2836!72 → 35.283600
a35.283672 → 0.000000
!35.283672 → 0.000000
abc → 0.000000
!@# → 0.000000
알파벳 e를 사용하여 지수 표기법으로 된 문자열도 실수로 바꿀 수 있음
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* s1 = "3.e5"; //"3.e5"는 문자열
float num1;
num1 = atof(s1); //문자열을 실수로 변환하여 num1에 할당
printf("%e %f\n", num1, num1); //3.000000e+05 300000.000000
return 0;
}
strtof 함수를 사용하면 여러 개의 실수로 된 문자열을 실수로 바꿀 수 있음. 함수 이름은 string to float에서 따옴. (stdlib.h 헤더파일)
strtof(문자열, 끝포인터);
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* s1 = "35.283672 3.e5 9.281772 7.e-5";
float num1;
float num2;
float num3;
float num4;
char* end; //이전 숫자의 끝 부분을 저장하기 위한 포인터
num1 = strtof(s1, &end);
num2 = strtof(end, &end);
num3 = strtof(end, &end);
num4 = strtof(end, NULL);
printf("%f\n", num1); // 35.283672
printf("%f\n", num2); // 3.000000e+05
printf("%f\n", num3); // 9.281772
printf("%f\n", num4); // 7.000000e-05
return 0;
}
참고) strtod
strtod 함수는 문자열을 double 형 실수로 변환함.
strtod(문자열, 끝포인터);
46.4 정수를 문자열로 변환하기
sprintf 함수를 사용하면 정수를 문자열로 변화할 수 있음. (stdio.h 헤더 파일)
sprintf(문자열,"%d",정수);
sprintf(문자열,"%x",정수);
sprintf(문자열,"%X",정수);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char s1[10];
int num1 = 283;
sprintf(s1, "%d", num1);
printf("%s\n", s1); //283
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char s1[10];
int num1 = 283;
sprintf(s1, "0x%x", num1);
printf("%s\n", s1); //0x11b
return 0;
}
0x를 붙이지 않아도 상관 없지만 10진수 100과 알파벳이 섞여있지 않은 16진수 100은 헷갈리기 쉬움.
46.5 실수를 문자열로 변환하기
sprintf(문자열,"%f", 실수);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char s1[10];
float num1 = 38.972340f;
sprintf(s1, "%f", num1);
printf("%s\n", s1); // 38.972340
return 0;
}
지수표기법으로 된 문자열도 변환할 수 있음
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char s1[20];
float num1 = 38.972340f;
sprintf(s1, "%e", num1);
printf("%s\n", s1); // 3.897234e+01
return 0;
}
여기서 변환한 문자열이 길어질 수 있으므로 반드시 배열의 크기(동적 메모리로 할당한 크기)를 확인.
'C > C언어 코딩도장' 카테고리의 다른 글
UNIT 48 구조체 사용하기 (0) | 2022.03.07 |
---|---|
UNIT 47 회문 판별과 N-gram 만들기(문자열 응용) + 핵심정리 (0) | 2022.02.27 |
UNIT45 문자열 자르기 (0) | 2022.02.27 |
UNIT 44 문자열 검색하기 (0) | 2022.02.26 |
UNIT 43 문자열 만들기 (0) | 2022.02.26 |