코딩 36일차 C/C++

마스터피스·2023년 11월 12일
0

C/ C++ 

목록 보기
7/35
post-thumbnail

문자열 - 문자의 배열

1) scanf("%99[^\n]s", myString); // 99개 문자열 중에 줄바꿈 제외하고 표현한다는 뜻.
//항상 이렇게 써야 문자열을 읽어올 수 있으니 외워야한다.

2) scanf : 문자열은 &를 빼주고 다른 정수나 실수는 &를 넣어줘야한다.

    #include "Header.h"

    int main() {

        char myString[100];

        scanf("%99[^\n]s", myString);

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


        return 0;
    }

3) 문자열이란?

  • 문자열은 C / C++ 뿐 아니라 다른 언어에서도 가장 많이 다루는 데이터 형태입니다. C 에서는 문자열이라는 데이터 형태를 기본형 자료로 제공하지 않고, 사용자가 직접 조작할 수 있는 문자열을 제공합니다. 문자열은 말 그대로 문자의 '배열'이라는 뜻입니다. 문자의 배열이니까 문자를 위해 많이 쓰는 자료형인 char 형태의 변수에 배열을 선언하여 활용하면 됩니다

4) #include <>

  • 문자열 관련 유용한 함수들을 사용하기 위해서 우리는 cstring 이라는 헤더 파일을 찾아 집어넣어 주어야 합니다.

5) char string[100]

  • 문자열 변수를 만들기 위해 char 의 배열 형태의 문자열 변수를 만들고, 배열의 크기는 프로그래머가 '예측' 하고 있어야 합니다. 물론 가변적 크기의 문자열 또한 만들 수 있습니다만 그것은 나중에 포인터에 대해 배우면서 차차 알아보도록 하겠습니다.

5) strcpy( ... )

  • strcpy 라는 함수는 문자열 배열에 우리가 흔히 쓰는 문자열을 집어 넣어줄 수 있는 함수입니다. 문자열을 printf 로 출력하기 위해서 사용되는 변환 문자는 %s 입니다.

//이 strcpy( ... )함수를 사용하기 위해서는 #define _CRT_SECURE_NO_WARNINGS가 헤더파일이나 소스파일 가장 처음 부분에 있어야 합니다.

6) scanf( ... )

  • 지금부터는 #define _CRT_SECURE_NO_WARNINGS를 집어넣고 scanf_s 대신 scanf 함수를 사용합니다. scanf_s 와 scanf 는 문자열을 입력받는 방법이 서로 다릅니다. 때문에 지금부터는 맥과 윈도우즈간 통일성을 위해 scanf함수 하나로만 강의를 진행합니다. scanf를 활용할 때에는 역시 변환문자를 %s 로 지정해줘야 하지만 세세한 부분이 다릅니다. 최대로 입력받을 문자열의 크기를 지정해줘야하며,문자열을 입력받을 경우에 변수의 앞에 &(앰퍼샌드) 기호를 넣지 않는 것이 특징입니다. 이는 scanf("%99[^n]s", myString); 의 형태가 됩니다.

7) strcmp();

  • strcmp 함수는 문자열 두 개를 파라미터로 받아 두 문자열을 비교해주는 함수입니다. 두 문자열이 같다면 0이 리턴이 되고 사전적 우선순위에 따라 -1과 1이 리턴이 될 수 있습니다. 파라미터의 위치를 기준으로 좌측 파라미터의 우선순위가 높다면 -1, 우측 파라미터의 우선순위가 높다면 1이 리턴되게 됩니다.

  • 구문은 두 문자열이 같은지 비교하는 구문이다. 결과가 0이면 같다. -1이면 왼쪽 수가 오른쪽 수 보다 문자 배열상 크다. +1 이면 반대이다.

8) strcpy();
문자열을 복사할때 사용한다.

9) Null terminated string - NULL 문자는 \0을 활용해 지정 가능하다.

  • C / C++ 에서의 문자열의 처리 방식은 Null terminated string 입니다. 단어만 보면 굉장히 어려워보이지만 이 Null terminated string은 문자열의 가장 마지막엔 널 문자, 즉 0, 혹은 '0' 이라는 문자로 종료가 되어야 한다는 뜻입니다. 때문에 문자열을 받을 때 널(Null)문자의 공간까지 생각을 해 주어야 합니다. 따라서 scanf 에서 100개의 문자를 받아 문자열로 만든 것이 아닌 99개의 문자만 받아 문자열로 만든 것이고 마지막 99번 인덱스의 문자 배열 위치에는 널(Null)값이 들어갈 수 있도록 공간을 남겨둔 것입니다.
  1. 강의중 작성한 코드
#include "Header.h"

int main() {

    char myString[100];

    scanf("%99[^\n]s", myString);

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


    // strcpy 예제코드
    /* char inputString[100];
    printf("문자열을 입력하세요:");
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", inputString);


    char duplicatedString[100];
    strcpy(duplicatedString, inputString);
    printf("입력된 문자열은 %s 입니다.", duplicatedString);
    */

    /*
    char str1[100];
    char str2[100];

    strcpy(str1, "HelloA");
    strcpy(str2, "HelloB");

    int result = strcmp(str1, str2);
    printf("%d", result);
    */

    return 0;
}

연습문제 1)

SOL)
#include "Header.h"

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);


    strcpy(input1, input2);

    if (strcmp(input1, input2) == 0) {
        printf("True");
    }
    else {
        printf("False");
    }


    return 0;
}

2)

SOL)
#include "Header.h"

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;
	if (input1[i] != input2[i]) same = false;
}

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

return 0;

}

과제형 문제)

SOL)

#include "Header.h"

int main() {

    char input1[100];
    char rev[100];
    int size;

    printf("문자열을 입력하세요.: ");
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", input1);



    for (int i = 0; i < 100;i++) {
        if (input1[i] == '\0') {
            size = i;
            break;
        }
    }

    for (int i = 0; i < size+1; i++) {
        if (input1[i] != '\0') {
            rev[i] = input1[size - i- 1];
        }

        else {
            rev[i] = '\0';
        }
    }

    printf("뒤집힌 문자열은 %s 입니다.", rev);




    return 0;

}

다른 방법

 "Header.h"

int main() {

    char input[100];
    char rev[100];
    int index;

    printf("문자열을 입력하세요.: ");
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", input);



    for (int i = 0; i < 100;i++) {
        if (input[i] == '\0') {
            index = i;
            break;
        }
    }

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


    printf("뒤집힌 문자열은 %s 입니다.", rev);




    return 0;

}
profile
코딩 일지

0개의 댓글