본문 바로가기
cs/CS50

3: 배열-5(문자열의 활용)

by 이쟝 2021. 11. 28.

문자열의 길이 및 탐색

사용자로부터 문자열을 입력받아 한 글자씩 출력하는 프로그램을 만들기

For 루프를 통해 문자열의 인덱스를 하나씩 증가시켜가면서 해당하는 문자를 출력하면 됨

 

#include <stdio.h>

int main(void)
{
    string s = get_string("Input: ");
    print("Output: ");
    for(int i = 0, ???, i++)
    {
        printf("%c", s[i]);
    }
    print("\n");
}

 

for 루프에서 조건은 문자열의 길이만큼 나와야 함. 그래서 ???조건에서는 i가 문자열의 길이보다 작아야 함 이때 strlen()이라는 함수를 사용할 수 있음! strlen은 문자열의 길이를 알려주는 함수로 <string.h> 라이브러리에 포함되어 있음

<string.h>를 포함하지 않으면 컴파일할 때 clang은 strlen함수의 존재 여부를 모르기 때문에 에러가 발생!

 

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

int main(void)
{ 
    string s = get_string("Input: ");
    printf("Output: ");
    for(int i=0;i<strlen(s);i++)
    {
        printf("%c",s[i]);
    }
    printf("\n");
}

 

 

결과

결과는 잘 나온다!

하지만 for 루프의 가운데 있는 조건문은 질문을 나타내는 불리언 표현으로 계속해서 물어보고 확인하는 것을 반복함

이것을 해결하기 위해서 n이라는 변수에 strlen() 함수를 넣기!

 

 string s = get_string("Input: ");
    printf("Output: ");
    int n = strlen(s)
    for(int i=0;i<n;i++)

 

이렇게 루프에서 한 번만 물어보고 계속 사용하려는 값이 있다면 for문 한 줄 안에 써도 됨!

 

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

int main(void)
{ 
    string s = get_string("Input: ");
    printf("Output: ");
    for(int i=0,n=strlen(s);i<n;i++)
    {
        printf("%c",s[i]);
    }
    printf("\n");
}

문자열의 길이 및 탐색

사용자로부터 문자열을 입력받아 소문자이면 대문자로 바꿔주는 프로그램을 작성!

 

int main(void)
{
    string s = get_string("Before: ");
    printf("After: ");
    for(int i=0, n=strlen(s); i<n; i++)
    { 
        if(s[i]>='a'&&s[i]<='z')
        {
            //convert to uppercase
        }
        else
        {
            printf("%c",s[i]);
        }
    }  
      printf("\n");
}

 

- 먼저 사용자로부터 입력받은 문자를 s라는 변수에 저장

- 그리고 s의 길이만큼 for 루프를 돌면서 각 인덱스에 해당하는 문자가 'a'보다 크고 'z'보다 작은 지 검사함 == 소문자인지 검사하는 것(a부터 z까지 소문자인가? 그렇다면 대문자로 바꿔라!, 만약 대문자이면 그대로 출력!)

- //convert to uppercase를 채워 넣어야 함

 

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

int main(void)
{
    string s = get_string("Before: ");
    printf("After: ");
    for(int i=0, n=strlen(s); i<n; i++)
    { 
        if(s[i]>='a'&&s[i]<='z')
        {
            printf("%c",s[i]-32);
        }
        else
        {
            printf("%c",s[i]);
        }
      }  
      printf("\n");
}

 

- 문자의 대소 비교가 가능한 이유: ASCII값(아스키코드), 즉 문자가 정의되는 ASCII코드 상에서의 숫자 값으로 비교할 수 있음 

- 아스키코드를 살펴보면 각 알파벳의 소문자와 대문자는 32씩 차이가 남!

- 각 문자가 소문자인 경우 그 값에서 32를 뺀 후에 '문자'형태로 출력하면 대문자가 출력이 된다!!

- 만약 이미 문자가 대문자인 경우 그대로 출력!

- 이렇게 해도 결괏값이 올바르게 출력이 되지만 더 간단하게 toupper() 함수를 사용할 수 있음!

 

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

int main(void)
{
    string s = get_string("Before: ");
    printf("After: ");
    for(int i=0, n=strlen(s); i<n; i++)
    { 
        printf("%c",toupper(s[i]));
    }  
      printf("\n");
}

 

- toupper() 함수는 소문자를 대문자로 바꿔주는 기능을 함 <ctype.h> 라이브러리에 있음

- 이미 만들어져 있는 toupper 함수를 사용하면 간단하게 대문자 변환 프로그램을 작성할 수 있음

 

 

https://www.boostcourse.org/cs112/joinLectures/41307

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org