문자열은 어떤 값인가에 따라서 정수형이나 실수형으로 변환이 가능합니다.
먼저 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 |
댓글