C언어 입/출력 문자열관련 함수

    2018-02-09 16:53:59 작성

    string.h 에서 제공하는 문자열 관련 함수입니다.

    strlen

    문자열의 길이를 반환합니다.

    size_t strlen(const char * s);

    size_t는 typedef로 선언된 unsigned int형 입니다.
    NULL문자를 제외한 문자열의 길이를 반환합니다.

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
    	char str[100] = "i like C program";
    	printf("str의 크기 %d\n", sizeof(str));
    	printf("str의 문자 길이 %d\n", strlen(str));
    	return 0;
    }


    strcpy, strncpy

    문자열을 복사합니다.

    char * strcpy(char * dest, const char * src);
    char * strncpy(char * dest, const char *src, size_t n);

    strcpy, strncpy 함수는 복사된 문자열의 주소를 반환 합니다.
    strcpy 함수는 src의 문자열이 dest로 복사되며 이때 dest의 배열길이가 src의 문자열의 길이보다 작지 않도록 주의 해야 합니다.
    strncpy 함수는 src의 문자열에서 dest로 복사되며 이때 n개 만큼만 복사 됩니다.
    그래서 일반적으로 dest의 배열 길이만큼만 복사할때 유용합니다.
    문자열에 NULL 문자가 자동으로 삽입되지 않음을 유의 하세요.

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
    	char ori[100] = "i like C program";
    	char cpy1[20];
    	char cpy2[10];
    	char cpy3[10];
    	strcpy(cpy1, ori);
    	printf("%s\n", cpy1);
    	strncpy(cpy2, ori, sizeof(cpy2));
    	printf("%s\n", cpy2);
    	strncpy(cpy3, ori, sizeof(cpy3)-1);
    	cpy3[sizeof(cpy3) - 1] = '\0';
    	printf("%s\n", cpy3);
    	return 0;
    }


    cpy2에 복사할때 10개의 문자를 복사하면서 NULL이 없기 때문에 비정상적으로 출력되는것을 볼 수 있습니다.
    cpy3의 경우 처럼 문자열의 마지막에 NULL을 삽입해야 정상적으로 출력됩니다.


    strcat, strncat

    문자열을 덧붙입니다.

    char * strcat(char * dest, const char * src);
    char * strncat(char * dest, const char * src, size_t n);

    strcat, strncat 함수는 덧붙여진 문자열의 주소를 반환 합니다.
    strcat 함수는 dest의 문자열 뒤에 src의 문자열을 덧붙입니다.
    strncat 함수는 dest의 문자열 뒤에 src의 문자열 최대 n개 만큼 덧붙입니다.

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
    	char dest1[20] = "first~";
    	char src1[20] = "second";
    	char dest2[20] = "my birth : ";
    	char src2[20] = "760529-1000001";
    	strcat(dest1, src1);
    	printf("%s\n", dest1);
    	strncat(dest2, src2, 6);
    	printf("%s\n", dest2);
    	return 0;
    }


    문자열의 끝에 NULL문자가 자동으로 추가 됩니다.
    문자열을 덧붙일때 dest의 공간이 충분해야 합니다.
    dest의 size를 벗어나면 에러가 발생됩니다.


    strcmp, strncmp

    문자열을 비교합니다.

    int strcmp(const char * s1, const char * s2);
    int strncmp(const char * s1, const char * s2, size_t n);

    문자열의 크고작음은 ASCII 코드값을 기준으로 결정합니다.
    strncmp 함수는 문자열의 앞에서부터 n개 만큼만 비교를 합니다.

    • s1 == s2 이면 0을 반환
    • s1 > s2 이면 양수 반환
    • s1 < s2 이면 음수 반환
    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
    	char s1[20];
    	char s2[20];
    	printf("1. 문자열 : ");
    	scanf("%s", s1);
    	printf("2. 문자열 : ");
    	scanf("%s", s2);
    
    	if (!strcmp(s1, s2)) {
    		printf("두 문자열은 동일합니다.\n");
    	}
    	else {
    		printf("두 문자열은 다릅니다.\n");
    		if (!strncmp(s1, s2, 3)) {
    			printf("하지만 앞에 3개의 문자는 동일합니다.\n");
    		}
    	}
    	return 0;
    }


    atoi, atol, atof

    이 함수는 stdlib.h에 포함되어있습니다.
    문자열을 정수나 실수로 변환합니다.

    int atoi(const char * str); // int형 반환
    long atol(const char * str); // long형 반환
    double atof(const char * str); // double형 반환

    문자열 정수나 실수로 변환하지 못하면 0을 반환합니다.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    	char str[20];
    	printf("정수입력 : ");
    	scanf("%s", str);
    	printf("입력한 정수 : %d\n", atoi(str));
    	printf("실수입력 : ");
    	scanf("%s", str);
    	printf("입력한 실수 : %g\n", atof(str));
    	return 0;
    }



    연습문제

    1. 사용자로부터 문자열을 입력받아 문자열의 포함된 각 1자리의 숫자의 합을 구하는 프로그램을 작성하세요.


    1. 사용자로 부터 2명의 이름과 나이를 입력받습니다.
    2. fgets 함수로 입력을 받으며, "이름 30"와 같이 이름과 나이 사이는 공백으로 구분합니다.
    3. 이름과 나이를 각각 비교하여 같은지 다른지를 판단하는 프로그램을 작성하세요.