without haste but without rest

[C] 문자열 관련 함수 본문

ProgrammingLanguage/C

[C] 문자열 관련 함수

JinungKim 2020. 2. 26. 23:10
Reference - C언어 코딩도장

1. strlen( ) - String length

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

int main() {
    char* s1 = "Hello";
    char s2[10] = "Hello";

    printf("%d\n", strlen(s1));
    printf("%d\n", strlen(s2));

    return 0;
}

s1은 포인터 형태로 문자열을 저장했고, s2는 배열 형태로 문자열을 저장했다. 그런데 두 문자열의 길이를 출력하면 둘다 5가 출력된다. 배열로 저장한 경우 남은 배열이 모두 NULL값이 들어가지만 strlen 함수는 NULL값을 계산하지 않는다.

 

 


2. strcmp( ) - String Compare

strcmp 함수는 문자열을 매개변수로 받아서 같은지 비교하는 함수다. 동일하면 0을 리턴한다. 첫번째 값이 크면 -1, 두번째 값이 크면 1을 리턴한다.

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

int main() {
    char* s1 = "Hello";
    char s2[10] = "Hello";

    int ret = strcmp(s1, s2);

    printf("%d\n", ret);

    return 0;
}

 

 


3. strcpy( ) - String Copy

 

문자열은 다른 배열이나 포인터(메모리)로 복사할 수 있다.

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

int main() {
    char s1[10] = "Hello";
    char s2[10];

    strcpy(s2, s1);			// strcpy(입력, 복사할 소스)

    printf("%s\n", s2);

    return 0;
}

 

 

 

문자열 포인터를 복사하면 에러가 난다. 

char* s2가 읽기 전용 메모리기 때문에 문자열을 복사할 수가 없다. 

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

int main() {
    char* s1 = "Hello";
    char* s2 ="";

    strcpy(s2, s1);

    printf("%s\n", s2);

    return 0;
}

 

 

 

문자열 포인터에 문자열을 복사하려면 malloc 함수로 메모리를 할당하고 복사해야 한다.

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

int main() {
    char* s1 = "Hello";
    char* s2 = malloc(sizeof(char) * 10);

    strcpy(s2, s1);

    printf("%s\n", s2);

    return 0;
}

 

 


4. strcat( ) - String Concatenate

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

int main() {
    char s1[10] = "world";
    char s2[20] = "Hello";

    strcat(s2, s1);

    printf("%s\n", s2);       // 첫번째 파라미터에 두번째 값을 붙인다.

    return 0;
}

*strcat 함수도 문자열 포인터를 사용하려면 malloc 함수를 사용해서 메모리 크기를 동적으로 할당해주어야 한다.


5. strchr( ) - String Character

 

왼쪽에서부터 매개변수로 받은 문자를 검색한다. 

오른쪽에서 부터 검색하고자 하는 경우 strrchr 함수를 사용한다.

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

int main() {
    char s1[30] = "Hello, Wolrd!";

    char* ptr = strchr(s1, 'o');

    while (ptr != NULL) {
        printf("%s\n", ptr);
        ptr = strchr(ptr + 1, 'o');
    }

    return 0;
}

* ptr = strchr(ptr + 1, 'o') 코드에서 포인터 ptr + 1 이므로 printf 문 이후 "ello, World!" 가 된다.

 


6. strstr( ) - String find String

문자열 검색

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

int main() {
    char s1[30] = "Hello, Wolrd!";

    char* ptr = strchr(s1, 'llo');

    printf("%s\n", ptr);

    return 0;
}

* char* ptr은 llo로 시작하는 문자열을 검색하고 포인터로 반환한다.

 


*7. strtok( ) - String Tokenize

매개변수로 받은 값을 기준으로 문자열을 토큰화 한다.

아래 코드에서는 공백을 기준으로 s1 배열을 토큰화 했다.

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

int main() {
    char* s1 = malloc(sizeof(char) * 30);

    strcpy(s1, "Hello, C World!");

    char* ptr = strtok(s1, " ");

    while (ptr != NULL) {
        printf("%s\n", ptr);
        ptr = strtok(NULL, " ");
    }
	
    free(s1)
    
    return 0;
}

* while 문 안의 strktok(NULL, " ") -> NULL을 넣었을 때 직전 strtok 함수에서 자른 문자열 다음에서부터 시작한다. 

* C언어는 문자열 끝이 항상 NULL로 끝난다.

 

 

 

문자열 포인터를 자르려면 문자열 포인터에 리터럴을 할당하는 대신 메모리를 동적으로 할당해주어야 한다. 

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

int main() {
    char* s1 = malloc(sizeof(char) * 30);

    strcpy(s1, "Hello, C World!");

    char* ptr = strtok(s1, " ");

    while (ptr != NULL) {
        printf("%s\n", ptr);
        ptr = strtok(NULL, " ");
    }
	
    free(s1);
    
    return 0;
}

** 포인터의 읽기 전용과 리터럴에 대한 이해가 더 필요하다.


8. atoi( ) - ASCII String to Integer

 

문자 -> 정수 = atoi

문자 -> 실수 = atof (ASCII String to Float)

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

int main() {
    char* s1 = "283";
    int num;

    num = atoi(s1);

    printf("%d\n", num);

    return 0;
}

* 실패시 0 리턴

 


 

'ProgrammingLanguage > C' 카테고리의 다른 글

[C] 공용체  (0) 2020.02.29
[C] 구조체  (0) 2020.02.27
[C] sprintf / 버퍼  (0) 2020.02.26
[C] 포인터  (0) 2020.02.26
[C] 데이터 입출력  (0) 2020.02.26
Comments