본문 바로가기

C언어

심화 C 언어 3 (문자열 - 문자의 '배열')

문자열

: 문자의 배열이라는 뜻, 문자 여러개가 나열된 형태

 

일반적으로 두가지 방법을 사용한다

  • 첫번째 방법 : char string[100];
  • 두번째 방법 : const char*string;
문자열 선언 방법
char mystring[100];

const char*mystr; // 포인터로 선언

#define _CRT_SECURE_NO_WARNINGS

: 가장 윗줄에 선언하게 되면 scanf를 사용할 수 있게 된다.

 

지금부터 scanf_s를 활용하지 않고 scanf를 사용한다.

선언하지 않으면 문자열 관련 함수 사용에도 제약이 있다.

특히 scanf와 scanf_s 두 함수는 문자열을 다루는 방법에 차이가 있으므로

앞으로는 scanf로 통일하여 사용한다.

 

#include <cstring>

: 문자열 관련 함수의 선언을 담고 있는 헤더파일

  • strcpy( ... ) : 문자열을 복사하는 함수
  • strcmp( ... ) : 문자열을 비교하는 함수
  • strcat( ... ) : 문자열을 이어붙이는 함수
  • strpos( ... ) : 문자열을 찾는 함수

strcpy( ... )

: cstring 헤더파일에 선언되어 있는 함수

문자열을 복사해주는 함수

문자열 배열에 우리가 흔히 쓰는 문자열을 집어 넣어줄 수 있는 함수

문자열을 printf 로 출력하기 위해서 사용되는 변환 문자는 %s 이다.

strcpy는 = 기호를 사용하면 정상적으로 동작하지 않음

문자열은 배열이기 때문에 문자열 하나하나의 값을 옮겨서 배열로 옮긴다.

 

**이 strcpy( ... ) 함수를 사용하기 위해서는

#define _CRT_SECURE_NO_WARNINGS 가

헤더파일이나 소스파일 가장 처음 부분에 있어야함**

#include "prc.hpp"


int main(){
    
    char myString[100]; // 문자열 변수
    /*선언 문자열이 사용될 문자열을 최대크기를 예상을 하고 그 예상된 크기를 이렇게 지정한 후에
예상된 크기의 배열을 선언하고 배열을 활용해야 되는 것, 유동적인 배열 크기를 지정하기 위해선 포인터를 배워야한다*/

    
    strcpy(myString, "Hello World"); // cstring 헤더파일에 선언되어 있는 함수, 문자열을 복사해주는 함수
    printf("%s", myString); // 문자열 출력시 %s라는 변환 문자를 활용, 문자열을 출력할때 배열 index [100]는 필요 없다.
    
    return 0;
}
#include "prc.hpp"

int main(){
char inputString[100];
    
    printf("문자열을 입력해주세요 : ");
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", inputString);
    
    char duplicatedString[100];
    strcpy(duplicatedString, inputString);

    //첫번째 파라미터가 문자열을 받을 배열, 두번째 파라미터가 문자열을 줄 파라미터
     duplicatedString = inputString이라 보면 됨
     duplicatedString에 inputString 값이 들어간다

    printf("입력된 문자열은 %s 입니다.", duplicatedString); 

 return 0;
}


 

scanf

scanf를 활용할 때에는 역시 변환문자를 %s 로 지정해줘야 하지만 세세한 부분이 다름

최대로 입력받을 문자열의 크기를 지정해줘야하며,

문자열을 입력받을 경우에 변수의 앞에 & (앰퍼샌드) 기호를 넣지 않는 것이 특징

이는 scanf("%99[^\n]s, myString"); 의 형태가 된다

--> 99개의 문자열을 받고 그리고 줄 바꿈 문자열은 받지 않는다.

문자열을 입력받기 위해서는 항상 이런식으로 입력을 받기 때문에 숙지

 

** myString 의 배열의 크기는 분명히 100인데 99까지만 받은 이유**

Null terminated String

: 일반적으로 컴퓨터 터미널에서 사용하는 문자열은 null-terminated string 이라고 한다.

있는 문자열의 끝을 null 문자열인 0 값을 집어넣어서 판단한다는 것

null 문자는 \0 을 활용해서 지정해줄 수 있다. \0은 숫자 0과 똑같은 값을 가지고 있다.

 

문자열은 문자로 이루어진 배열인데

그 말은 문자열 변수를 선언을 하고 각각의 원소에 a,p,p,l,e 

str[0] = 'a';

str[1] = 'p';

str[2] = 'p';

str[3] = 'l';

str[4] = 'e';

이렇게 집어넣게 되고 이것을 printf로 출력하게 되면 이상한 값이 출력

그 원인은 이 프로그램을 실행하게 되면 컴퓨터의 램 메모리 내부에 문자열 변수가 존재하고

이 문자열에 하나씩 a,p,p,l,e 라는 변수의 값이 할당이 되게 됨

그리고 다섯번째 index를 벗어난 여섯 번째 index 부터는 초기화 되지않는 어떤 쓰레기값이 들어감

printf 입장에서는 0이 나오기 전까지 null 즉 null 문자인 0이 나오기 전까지

지속적으로 다음 메모리들의 문자를 출력 하게 되는 것

왜냐하면 C에서는 기본적으로 null-terminated string 이기 때문임

null 문자열이 존재하는 곳이 바로 문자열의 끝이기 때문임

이것을 정상적으로 존재하게 하기위해서는 6번째 배열 str[6]에 null 문자인 \0을 집어넣게 되면 apple 만 출력

 

그래서 마지막에 null 문자가 들어갈 공간을 마련해 주기 위해서 배열변수는 100개 지만

최대 99개만 사용자로부터 입력 받아 넣게 된다.

#include "prc.hpp"


int main(){
    
    char myString[100]; // 문자열 변수


    scanf("%99[^\n]s", myString); // scanf를 활용할때 &를 쓰지 않음, 문자열을 받을 때는 &를 빼야함
    
    printf("입력된 문자열은 %s 입니다.\n", myString);

 

strcmp( ... )

: cstring 헤더파일에 선언되어 있는 함수

문자열 두개를 파라미터로 받아 문자열을 비교해주는 함수

strcmp (str1, str2);

리턴값은 -1, 0, 1 셋 중 하나가 나온다

  • 좌측 파라미터의 문자열과 우측 파라미터에 문자열이 같다면 0을 리턴
  • 좌측 파라미터의 문자열이 사전적 우선도가 높다면 -1
  • 우측 파라미터의 문자열이 사전적 우선도가 높다면 1 이 리턴
  • (a 라는 문자열과 b 라는 문자열을 비교했을때 a 가 사전적 우선도가 높다)
#include "prc.hpp"


int main(){


    char str1[100];
    char str2[100];
    
    strcpy(str1, "HelloA");
    strcpy(str2, "HelloB");
    
    int result = strcmp(str1, str2);
    // str1 이 사전적 우선순위가 높다
    
    printf("%d", result);
    
    
    return 0;
}

 

연습 프로그래밍 #1

사용자로부터 문자열 두개를 입력받아

두 문자열이 같다면 true를 출력하고,

두 문자열이 다르다면 false를 출력하는 프로그램을 작성하세요

#include "prc.hpp"


int main(){
    
    char input1[100];
    char input2[100];
    
    printf("문자열을 입력하세요 : ");
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", input1);
    
    printf("문자열을 한번 더 입력하세요 : ");
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", input2);
    
    
    if (strcmp(input1, input2)==0){
        printf("True\n");
    }
    else {
        printf("False\n");
    }
    
    return 0;
}

 

연습 프로그래밍 #2

사용자로부터 문자열 두개를 입력받아

두 문자열이 같다면 true를 출력하고,

두 문자열이 다르다면 false 를 출력하는 프로그램을 작성하세요

헤더파일 cstring에 존재하는 strcmp 함수를 사용하지 않고 만들어보세요

#include "prc.hpp"


int main(){
    
    char input1[100];
    char input2[100];
    
    printf("문자열을 입력하세요 : ");
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", input1);
       
    
    printf("문자열을 한번 더 입력하세요 : ");
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", input2);
    
    bool same = true;
    for (int i=0;;i++){
        if (input1[i] == '\0') break; // i를 0부터 무한반복하고 종료조건은 여기에 따로 줌
        if (input1[i] != input2[i]) same = false;
        // input1의 i번째 배열과 input2의 i번째 배열이 서로 다르다면 same이라는 bool변수의 값이 false가 됨
        // 그리고 이것이 만약에 이 if절을 단 한 번도 거치지 않았다면 두개의 문자에 값이 같은 것이므로
          same은 true에서 변함이 없는 상태로 input 부분에서 loop을 종료를 하고 그 다음에 탈출을 하게됨

    }
    
    if (same == true){
        printf("두 문자열은 같습니다.");
    }
    else {
        printf("두 문자열은 다릅니다.");
    }
       
       
    
    return 0;
}

과제형 연습 프로그래밍

사용자로부터 문자열을 입력받아

해당 문자열을 거꾸로 출력하는 프로그램을 작성하세요

헤더파일 cstring에 존재하는 함수를 사용하지 않고 만들어보세요

 

#include "prc.hpp"


int main(){


    char input[100];
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", input);
    
    int index = 0;
    for(int i = 0; ; i++){
        if (input[i] == '\0') {
            index = i; // 이 for loop를 다 탈출하고 난 다음은 index가 null 문자를 가리키고 있는 배열 위치
            break;
        }
    }

    for (int i = index - 1; i >= 0; i--){
        printf("%c", input[i]);
    }
    
    return 0;
}

** loop를 돌면서 해당 문자열의 마지막 null 문자를 확인한 후 null 문자의 바로 직전 위치부터 
    하나씩 거꾸로 돌아가면서 문자를 하나씩 출력을 해 주면 된다 **