공부 자료실/C언어

C언어 - 문자열 변환

자료수집중 2020. 6. 30.
반응형

문자열은 어떤 값인가에 따라서 정수형이나 실수형으로 변환이 가능합니다.

 

먼저 sscanf()_s에 대해 알아보겠습니다.

sscanf()_s는 문자열에서 원하는 자료형의 데이터를 읽어내서 반환합니다.

 

*sscanf()도 사용은 가능하나 warning이 발생합니다.

해당 st 문자열에서 정수형 형식을 읽어서 정수형 값을 num변수에 저장하는 코드입니다.

sscanf(st, "%d", &num);

 

sscanf()_s함수의 원형은 다음과 같습니다.

int sscanf_s(const char* str, const char* format, ...);

보기만 해서는 잘 이해가 안 갈 수 있습니다.

format을 어떤 식으로 처리하냐에 따라서 굉장 다양하게 사용이 가능합니다.

예제와 함께 보겠습니다.

#include <stdio.h>

int main(void) {
    char st[] = "10 20 30 40 50";
    int num;
    sscanf_s(st, "%d", &num);
    printf("%d \n", num);
	
    return 0;
}

C언어 - 문자열 변환

결과를 보면 문자열에서 첫 번째 정수를 변수에 저장했습니다.

 

 

sscanf_s()는 이렇게 간단하게도 사용할 수 있지만 다른 예제를 보겠습니다.

#include <stdio.h>

int main(void) {
    char st[] = "10.341 apple 30 40 50";
    float num;
    char st2[30];
    int num2;
    sscanf_s(st, "%f %s %d", &num, st2,sizeof(st2), &num2);
    printf("%f \n%s \n%d\n", num, st2, num2);
    return 0;
}

C언어 - 문자열 변환

문자열에서 각각에 맞는 형식 지정자만 지정해준다면 변수에 각각 저장이 가능합니다. 기본적으로 따로 지정하지 않는다면 공백이 나누는 기준이 됩니다.

!!그리고 문자열을 저장할때는 문자열 뒤에 버퍼의 크기가 꼭 같이 들어가야합니다. 이 부분이 sscanf()와의 차이입니다.

 

 

만약에 중간에있는 정수만 저장하고 싶다면

#include <stdio.h>

int main(void) {
    char st[] = "10.341 apple 30 40 50";
    int num;
    sscanf_s(st, "%*f %*s %d", &num);
    printf("%d \n", num);
    return 0;
}

C언어 - 문자열 변환

형식 지정자에 *를 넣게 되면 무시하고 다음으로 진행합니다.

 

 

특정 문자들만 지정해서 저장도 가능합니다.

#include <stdio.h>

int main(void) {
	char st[] = "abcdefgHijklmn";
	char st1[30];
	sscanf_s(st, "%[a-z]", st1, sizeof(st1));
	printf("%s \n", st1 );
	return 0;
}

C언어 - 문자열 변환

%[a-z]는 a~z까지의 소문자만 문자열에 저장한다는 의미입니다. 그래서 대문자 H의 전까지만 저장이 됩니다.

 

 

특정 조건을 넣지 않으면 공백까지 읽어서 저장합니다.

그래서 어디까지 읽으라는 조건을 추가해보겠습니다.

#include <stdio.h>
int main(void) {
	char st[] = "10.341,apple,30,40,50";
	char st1[30];
	sscanf_s(st, "%*[^,],%[^,]", st1,sizeof(st1));
	printf("%s \n", st1 );
	return 0;
}

C언어 - 문자열 변환

%[^,]를 살펴보면 여기서 ^는 ~까지라는 의미입니다.  ,(콤마)까지 문자열로 읽으라는 의미입니다.

%*[^,]는 ,(콤마)까지 문자열을 건너뛰라는 의미입니다. 그래서 10.341을 건너뛰고 apple이 저장된거죠.

다른 예로 보면 %[^p]는 문자 p가 나올때까지 읽어드리라는 의미입니다.

*%[^\n]를 이용하면 scanf()를 getchar()처럼 공백도 입력이 가능합니다.

scanf("%[^\n]", st);는 엔터 전까지 모든 문자열을 저장하겠다는 의미가 됩니다.

 

 

근데 자세히 보면 조건이 추가되면 문자열로만 읽을 수 있습니다.

그래서 문자열을 정수 또는 실수로 변경이 가능한 함수를 알아보겠습니다.

먼저 stdlib.h를 추가해야 합니다.

atoi() 문자열을 int형으로 변환, atof() 문자열을 double형으로 변환, , atol() 문자열을 long형으로 변환하는 함수가 있습니다. 

함수의 원형은 다음과 같습니다.

int atoi(const char* str);
double atof(const char* str);
long atol(const char* str);

사용법은 간단합니다.

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

int main(void) {
	
	char st[] = "1234";
	int num;
	num = atol(st);
	printf("%d \n", num);
}

C언어 - 문자열 변환

인자로 받은 문자열을 변환해서 저장합니다.

만약 변환이 불가능하다면 0을 반환합니다.그래서 입력된 문자열이 정수 또는 실수인지를 판단하는 조건으로도 많이 사용됩니다.

 

 

반대로 정수 또는 실수를 문자열로 변환도 가능합니다.

sprintf()를 이용해 문자열로 변환할 수 있습니다.

함수 원형은 다음과 같습니다.

int sprintf(char *buffer,const char *format , ...);

예제를 보면

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

int main(void) {
	
	char st[100];
	int num = 1004;
	sprintf(st, "%d", num);
	printf("%s \n", st);
	
	return 0;
}

C언어 - 문자열 변환

num에 저장된 정수 1004가 문자열 st에 저장돼서 출력이 됩니다.

잘못된 형식 지정자가 입력되면 0을 저장하기 때문에 변환할 데이터의 자료형과 같은 형식 지정자인지 꼭 확인해야 합니다.

'공부 자료실 > C언어' 카테고리의 다른 글

C언어 - 열거형  (0) 2020.07.02
C언어 - 공용체  (0) 2020.07.01
C언어 - 문자,문자열의 입력, 출력  (0) 2020.06.30
C언어 - 문자열과 포인터  (0) 2020.06.29
C언어 - 문자열  (0) 2020.06.29

댓글