C언어 배열과 포인터 문자열

    2018-02-05 19:09:04 작성

    문자열을 문자를 표현하는 char형 자료형의 배열입니다.
    문자는 ' 홀따옴표로 표현합니다.
    문자열은 " 쌍따옴표로 표현합니다.

    문자열은 다음과 같이 선언 및 초기화할 수 있습니다.

    char str[13] = "Hello World!";

    위와 같이 선언한 str배열은 다음과 같은 형태로 문자열이 저장됩니다.

    문자열의 경우 문자열의 끝을 알리는 null 문자가 삽입되기 때문에 문자열의 길이는 보여지는 문자 +1 의 길이를 갖습니다.
    다음 코드는 null 문자의 존재를 확인하는 예제입니다.

    #include <stdio.h>
    
    int main(void) {
        char str[] = "Hello World!";
        int len = sizeof(str);
        int last = len - 1;
        int idx;
        printf("배열 str의 길이 : %d\n", sizeof(str));
        printf("null 문자의 문자형 출력 : %c\n", str[last]);
        printf("null 문자의 정수형 출력 : %d\n", str[last]);
    
        printf("문자열을 null문자가 아닐때까지 요소를 반복하여 출력!\n");
        idx = 0;
        while (str[idx] != '\0') {
            printf("%c", str[idx]);
            idx++;
        }
        printf("\n");
        printf("문자열 출력 : %s\n", str);
        return 0;
    }


    배열의 요소는 0부터 시작하므로 마지막 요소는 요소의 개수 -1이 됩니다.
    문자열도 배열이기 때문에 요소의 인덱스 값으로 접근이 가능합니다.
    반복문에서 '\0' 은 특수문자 null(0)을 의미합니다. 문자 '0'은 ASCII 코드 48입니다.


    문자열의 입력과 출력

    scanf함수에서 문자열을 입력받을 때에는 다음과 같은 형식으로 입력을 받습니다.

    scanf("%s", str);

    정수형이나 실수형 자료형과 다르게 &(주소연산자)이 없는것을 볼 수 있습니다.
    컴파일러에 따라 str변수에 &str 하여도 오류가 없이 실행되기도 하지만 이는 잘못된 문장입니다.

    #include <stdio.h>
    
    int main(void) {
        int idx, num;
        char str[50];
        printf("정수를 입력하세요 : ");
        scanf("%d", &num);
        printf("문자열을 입력하세요 : ");
        scanf("%s", &str); // 잘못된 문장이지만 실행된다.
        printf("입력받은 정수 : %d\n", num);
        printf("입력받은 문자열 : %s\n", str);
        printf("\n입력받은 문자열을 반복문으로 출력!\n");
        idx = 0;
        while (str[idx] != '\0') {
            putchar(str[idx]);
            idx++;
        }
        printf("\n");
        return 0;
    }


    문자열을 입력받게 되면 문자열의 마지막에 자동으로 null 문자가 입력됩니다.
    그렇다면 왜 문자열에는 항상 null 문자가 있어야 할까요?

    #include <stdio.h>
    
    int main(void) {
    	int idx;
    	char str[100] = "I like C Programming!";
    	printf("%s\n", str);
    
    	str[8] = '\0'; // C 다음에 null문자 삽입
    	printf("%s\n", str);
    
    	str[6] = '\0'; // like 다음에 null문자 삽입
    	printf("%s\n", str);
    
    	str[1] = '\0'; // I 다음에 null문자 삽입
    	printf("%s\n", str);
    
    	idx = 2;
    	while (str[idx] != 0) { // l부터 시작
    		putchar(str[idx]);
    		idx++;
    	}
    	printf("\n");
    	return 0;
    }


    printf 함수의 문자열 출력은 null 문자를 만날때까지 출력 하는 것을 볼 수 있습니다.

    scanf 함수 문자열 입력시 주의사항

    scanf함수는 입력시 공백을 기준으로 구분하기 때문에 문자열 입력시 공백이 있으면 안됩니다.

    #include <stdio.h>
    
    int main(void) {
        char str[100];
        printf("문자열 입력 : ");
        scanf("%s", str);
        printf("입력받은 문자열 : %s\n", str);
        return 0;
    }


    문자열 입력시 공백도 입력을 받으려면 gets 함수를 사용해야 합니다.

    #include <stdio.h>
    
    int main(void) {
        char str[100];
        printf("문자열 입력 : ");
        gets(str);
        printf("입력받은 문자열 : %s\n", str);
        return 0;
    }


    연습문제

    1. 사용자로 부터 문자열을 입력받아 문자열의 길이를 출력하는 프로그램을 작성하세요.

    2. 사용자로 부터 문자열을 입력받아 문자열을 역순으로 출력하는 프로그램을 작성하세요.

    3. 사용자로 부터 문자열을 입력받아 ASCII코드값이 가장 큰값의 문자를 찾아 출력하는 프로그램을 작성하세요.