본문 바로가기
휴지통/C 언어

문자열 입력 함수

by 신재권 2021. 2. 2.

헤더파일 string.h에 선언된 문자열 관련 함수를 설명한다.

 

size_t = unsigned int 이다. 즉 부호없는 정수이다.

 

size_t strlen(const char *a);

->전달된 문자열의 길이를 반환하되, 널 문자는 길이에 포함하지 않음

 

#include <stdio.h>
#include <string.h>

void Remove(char* str) {
	int len = strlen(str); //널문자는 길이에 포함하지않음 만약 good가 입력한다고 가정
	//g o o d \n 0 이 저장되어있는것인데 , 널길이를 포함하지않기 때문에 5가반환
	str[len - 1] = 0;  //널문자는 길이에 
	//str[5-1] = 0; 은  str[4] 즉 인덱스값기준으로 4에 있는 것 \n을 제거하는 것
}

int main(){
char str[100];
printf("문자열 입력 : ");
fgets(str, sizeof(str), stdin);	
printf("길이 : %d , 내용 : %s \n", strlen(str), str);

RemoveBSN(str);
printf("길이 : %d , 내용 : %s \n", strlen(str), str);
return 0;
}
===================실행 결과=======================
문자열 입력 : Good morning
길이 : 13, 내용 : Good morning

길이 : 12, 내용 : Good morning

void Remove(char* str) {
int len = strlen(str); //널문자는 길이에 포함하지않음 만약 good가 입력한다고 가정
//g o o d \n 0 이 저장되어있는것인데 , 널길이를 포함하지않기 때문에 5가반환
str[len - 1] = 0;  //널문자는 길이에 
//str[5-1] = 0; 은  str[4] 즉 인덱스값기준으로 4에 있는 것 \n을 제거하는 것
}

위 코드를 보면 이해가 될것이다. fgets함수가 입력을 받을 때 엔터 키 까지 입력받는 것을

즉 Remove 함수를 호출해 \n 문자를 제거하는 것이다.

 

첫번째 출력결과는 길이 13을 출력하는데 이는 \n문자를 포함하고 있기에 13을 출력하는 것이다.

그리고 개행도  두번 이루어졌다.

 

결론 : 

strlen 함수는 널문자를 길이에 포함하지 않고 길이 정보를 반환한다. 

엔터키의 입력을 strlen함수를 사용해 제거할 수 있다.


문자열을 복사하는 함수 

char * strcpy(char *d, const char * s);    //배열 s를 배열 d에 복사

char * strncpy(char *d, const char*s, size_t n); //배열 s를 n의 길이만큼 배열 d에 복사

->복사된 문자열의 주소값 반환

 

strncpy는 복사될 배열의 길이를 넘어서지 않는 범위 내에서 복사를 진행하는 경우에 유용하다.

strncpy로 복사를 할때 주의할 점이있다.

strncpy는 길이정보에 널문자가 포함되지 않기 때문에, 딱 그 길이만큼의 문자만 복사가 된다.

즉 strncpy 함수의 세번째 인자로 배열의 실제 길이보다 하나 작은 값을 전달해서 널문자가 삽입될 공간을 남겨두고 복사를 하고, 배열의 끝에 널 문자를 삽입해야 한다.

 

strncpy(str3, str1, sizeof(str3)-1);

str3[sizeof(str3)-1] =0;  이런식으로 널문자를 직접 삽입해야 한다.


문자열을 덧붙이는 함수

char *strcat*(char *d, const char *s); //배열 s에 저장된 문자열을 배열 d의 뒤에 덧붙여라

char *strncat*(char *d, const char *s, size_t n); //배열 s에 저장된 문자열을 최대 n의 길이 만큼 배열 d의 뒤에 덧붙여라 

->덧붙여진 문자열의 주소 값  반환

 

또한 배열 s가 덧붙여지기 시작하는 위치는 배열 d의 널값부터이다. 즉 널값을 덮어 씌워 배열 d에 남아있는 널값을 없앤다. 

당연히 문자열에는 한개의 널값만 존재해야 한다 .

 

그리고 d의 배열이 s의 길이를 저장할 수 있을 만큼의 충분한 공간이 남아 있어야 한다.

size_t n에 저장된 길이만큼 덧붙여지는데 , 이 길이에 널문자는 포함이 안된다. 

실제로는 널문자가 포함한 상태로 +1개가 덧붙여진다.


문자열을 비교하는 함수

int strcmp(const char *s1, const char * s2); //배열 s1과 s2를 비교해라

int strncmp(const char * s1, constr char *s2, size_t n); 배열 s1과 s2를 비교하되, n의 길이까지만 비교해라

-> 두 문자열의 내용이 같으면 0, 같지 않으면 0이 아닌 값을 반환

 

s1이 더크면 양수 반환

s2가 더 크면 음수 반환

s1과 s2가 같으면 0을 반환

 

크고 작음의 기준은 아스키 코드 값을 기준으로 한다.

 

저장된 문자열중 한글자 찾기를 이함수로 사용하면 유용하다.


<stdlib.h>에 선언된 변환 함수들

int atoi(const char *str);   //문자열의 내용을 int형으로 변환

long atol(const char *str); //문자열의 내용을 long형으로 변환

double atof(const char * str); //문자열의 내용을 double형으로 변환

 

즉 문자열 123을 정수 123으로 변환 하거나 문자열 7.15를 실수7.15로 변환 해야하는 경우에 사용한다.

'휴지통 > C 언어' 카테고리의 다른 글

파일 입출력1  (0) 2021.02.06
구조체  (0) 2021.02.04
문자와 문자열  (0) 2021.02.01
함수 포인터, void 포인터  (0) 2021.01.31
다차원 배열과 포인터, 다중 포인터  (0) 2021.01.30