오리는 오늘도 꽥꽥

 

 

 

     

 

개요

[C언어] 문자열을 숫자로 바꾸기 - 2 (strtol, strtoul, strtod)

문자열을 숫자 값으로 바꿔주는 함수.

입력 값으로 문자열을 넣으면 숫자 값이 출력된다.

 

atoi, atol

문자열을 정수형으로 반환해주는 함수

헤더파일 stdlib.h 에 포함되어있다.

atoi는 int, atol은 long int 값을 반환한다.

  • 형식 : int atoi (const char * str);
  • 형식 : long int atol (const char * str);

https://www.cplusplus.com/reference/cstdlib/atoi/?kw=atoi 

 

atoi - C++ Reference

function <cstdlib> atoi int atoi (const char * str); Convert string to integer Parses the C-string str interpreting its content as an integral number, which is returned as a value of type int. The function first discards as many whitespace characters (as i

www.cplusplus.com

https://www.cplusplus.com/reference/cstdlib/atol/?kw=atol 

 

atol - C++ Reference

function <cstdlib> atol long int atol ( const char * str ); Convert string to long integer Parses the C-string str interpreting its content as an integral number, which is returned as a value of type long int. The function first discards as many whitespace

www.cplusplus.com

 

atof

 문자열을 실수형(double)로 반환해주는 함수.

헤더파일 stdlib.h 에 포함되어있다.

  • 형식 : double atof (const char* str);

https://www.cplusplus.com/reference/cstdlib/atof/?kw=atof 

 

atof - C++ Reference

A valid floating point number for atof using the "C" locale is formed by an optional sign character (+ or -), followed by a sequence of digits, optionally containing a decimal-point character (.), optionally followed by an exponent part (an e or E characte

www.cplusplus.com

 

itoa

정수를 문자열로 바꿔주는 함수.

이 함수는 c 표준함수가 아니기 때문에 컴파일러에 따라 제공해 줄수도 아닐 수도 있다.

itoa함수의 기능은 sprintf함수로 충분히 대체 가능하다..만 그래도 한번 알아보자.

 

  • 형식 : char *  itoa ( int value, char * str, int base );

https://www.cplusplus.com/reference/cstdlib/itoa/

 

itoa - C++ Reference

function <stdlib.h> itoa char * itoa ( int value, char * str, int base ); Convert integer to string (non-standard function) Converts an integer value to a null-terminated string using the specified base and stores the result in the array given by str param

www.cplusplus.com

 

Q. 제 컴파일러는 itoa를 제공하지 않는 것 같습니다. 근데 전 itoa 함수를 꼭 쓰고 싶습니다.

A.

char* itoa(int value, char* result, int base) {
		// check that the base if valid
		if (base < 2 || base > 36) { *result = '\0'; return result; }

		char* ptr = result, *ptr1 = result, tmp_char;
		int tmp_value;

		do {
			tmp_value = value;
			value /= base;
			*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
		} while ( value );

		// Apply negative sign
		if (tmp_value < 0) *ptr++ = '-';
		*ptr-- = '\0';
		while(ptr1 < ptr) {
			tmp_char = *ptr;
			*ptr--= *ptr1;
			*ptr1++ = tmp_char;
		}
		return result;
	}

 출처 : http://www.strudel.org.uk/itoa/

 

itoa with GCC | C/C++

Introduction Credits Development Latest Versions Performance Comparison How do I use itoa() with GCC? Arrgghh C/C++! It would appear that itoa() isn't ANSI C standard and doesn't work with GCC on Linux (at least the version I'm using). Things like this are

www.strudel.org.uk

 

Example

atoi, atol, atof 

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char * s = "2022.2022";
    int num_int;
    long int num_long;
    double num_double;
    num_int = atoi(s);
    num_long = atol(s);
    num_double = atof(s);

    printf("atoi result : %d\n", num_int);
    printf("atol result : %ld\n", num_long);
    printf("atof result : %f\n", num_double);

    return 0;
}

/*
출력
atoi result : 2022
atol result : 2022
atof result : 2022.202200
*/

 

itoa 

#include <stdio.h>
#include <stdlib.h>

char * itoa(int value, char* result, int base);

int main(){
    char buff[100];
    int number = 2022;

    // 10진수
    itoa(number, buff, 10);
    printf("%s\n", buff);
    
    // 2진수
    itoa(number, buff, 2);
    printf("%s\n", buff);

    // 16진수
    itoa(number, buff,16);
    printf("%s\n", buff);
    
    return 0;
}

char * itoa(int value, char* result, int base) {
		// check that the base if valid
		if (base < 2 || base > 36) { *result = '\0'; return result; }

		char* ptr = result, *ptr1 = result, tmp_char;
		int tmp_value;

		do {
			tmp_value = value;
			value /= base;
			*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
		} while ( value );

		// Apply negative sign
		if (tmp_value < 0) *ptr++ = '-';
		*ptr-- = '\0';
		while(ptr1 < ptr) {
			tmp_char = *ptr;
			*ptr--= *ptr1;
			*ptr1++ = tmp_char;
		}
		return result;
	}
    
    
/*
출력
2022
11111100110
7e6
*/

 

덭붙힘

문자열에 문자나 띄어쓰기가 포함되어 있을 경우, 앞에서부터 숫자로 인식되는 부분까지만 변환해준다.

ex) "112경찰" -> atoi -> 112, "소방차119" -> atoi -> 0(변환할 값이 없음), "123 45" -> atoi -> 123

 

16진수나 2진수 등의 숫자는 10진수로 변환하여 바꿔줘야하는 불편함이 있다.

이러한 단점을 해결한 함수로 strtol, strtoul 같은 함수가 있다.

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band