자료실/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;
}

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

 

 

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;
}

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

!!그리고 문자열을 저장할때는 문자열 뒤에 버퍼의 크기가 꼭 같이 들어가야합니다. 이 부분이 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;
}

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

 

 

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

#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;
}

%[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;
}

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

%*[^,]는 ,(콤마)까지 문자열을 건너뛰라는 의미입니다. 그래서 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);
}

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

만약 변환이 불가능하다면 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;
}

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

댓글