본문 바로가기
C/C언어 코딩도장

UNIT 46 문자열과 숫자를 서로 변환하기

by yeong1225 2022. 2. 27.
#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;
}

여기서 변환한 문자열이 길어질 수 있으므로 반드시 배열의 크기(동적 메모리로 할당한 크기)를 확인.