Minwoo Dev.

<윤성우의 열혈 C프로그래밍> :: 21. 문자와 문자열 관련 함수 문제풀이 본문

C++

<윤성우의 열혈 C프로그래밍> :: 21. 문자와 문자열 관련 함수 문제풀이

itisminu 2023. 9. 9. 21:46
728x90
반응형
SMALL

문제 21-1

문제 1

프로그램 사용자로부터 앒파벳 문자를 하나 입력 받아서, 입력받은 문자가 대문자면 이를 소문자로 변환해서 출력해주고, 입력 받은 문자가 소문자면 이를 대문자로 변환해서 출력해주는 프로그램을 작성해보자. 단, 문자의 입출력에는 getchar 함수와 putchar 함수를 사용하기로 하자. 그리고 프로그램 사용자가 알파벳 이외의 문자를 입력하는 경우에는 그에 따른 오류 메세지를 간단히 출력하기로 하자.

 

정답

#include<stdio.h>

int main(void)
{
    int ch;
    ch = getchar();

    if(ch>=65 && ch<=90){
        ch +=32;
    }
    else if(ch>=97 && ch<=122){
        ch -= 32;
    }
    else{
        printf("알파벳이 아닙니다. 알파벳을 입력해주세요.\n");
    }

    printf("%c\n",ch);

    return 0;
}

 

문제 21-2

 

문제 1

적당한 길이의 문자열을 입력 받아서 그 안에 존재하는 숫자의 총 합을 계산해서 출력하는 프로그램을 작성해 보자. 예를 들어서 프로그램 사용자로부터 입력받은 문자열이 "A15#43" 이라하면, 이 문자열 중 아라비아 숫자는 1,5,4,3 이니, 1+5+4+3의 연산결과가 출력되어야 한다.

 

정답

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

int ConvToInt(char c)
{
    static int diff = 1-'1';
    return c+diff;
}

int main(void)
{
    char str[50];
    int len = 0, i = 0;
    int sum = 0;
    
    printf("문자열 입력 : ");
    fgets(str,sizeof(str),stdin);
    len = strlen(str);

    for(i=0;i<len;i++){
        if('1'<=str[i] && str[i]<='9')
            sum += ConvToInt(str[i]);
    }
    printf("숫자의 총 합 : %d\n",sum);

    return 0;
}

 

 

문제 2

다음과 같이 총 3개의 배열을 선언한다.

char str1[20];
char str2[20];
char str3[40];

그리고는 str1과 str2를 통해서 프로그램 사용자로부터 문자열을 입력받되, fgets함수 호출을 통해서 입력받는다. 이어서 str1에 저장된 문자열을 str3에 복사하고, str2에 저장된 문자열을 str3에 저장된 문자열의 뒤에 덧붙이자. 그리고 마지막으로 str3에 저장된 문자열을 출력하자. 다소 설명이 복잡했는데, 예를 들어서 str1과 str2에 저장된 문자열이 각각 다음과 같다면,

str1	"Simple"
str2	"Strong"

str3에는 문자열 "SimpleStrong" 이 저장되어야 한다. 그런데 여기서 한가지 주의해야 할 사항이 있다. fgets 함수를 통해서 문자열을 읽어들이면 \n문자도 함께 읽혀지는데, 이는 문자열의 일부가 되지 않도록 해야한다는 점이다. 쉽게 말해서 str1과 str2에 저장된 문자열에서 \n은 소멸시켜야 한다.

 

정답

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

int main(void)
{
    char str1[20];
    char str2[20];
    char str3[40];

    fgets(str1,sizeof(str1),stdin);
    fgets(str2,sizeof(str1),stdin);

    for(int i=0;str1[i]!='\0';i++){
        if(str1[i]=='\n')
            str1[i] = '\0';
    }
    
    for(int i=0;str2[i]!='\0';i++){
        if(str2[i]=='\n')
            str2[i] = '\0';
    }

    strcpy(str3,str1);
    strcat(str3,str2);

    printf("%s\n",str3);

    return 0;
}

 

 

 

문제 3

프로그램 사용자로부터 이름과 나이를 다음에 형식에 맞춰서 하나의 문자열로 입력 받는다.

"이정선 29"
"한수정 7"
"오선주 17"

 

이름은 세 글자가 아닐 수도 있고 영문으로 입력될 수도 있다. 단, 이름과 나이 사이에만 공백이 삽입되어야 한다. 이러한 형식으로 두 사람의 정보를 입력받아서 이름과 나이가 각각 같은지 다른지를 판단하여 출력하는 프로그램을 작성해보자. 참고로 이 문제는 수준이 어느정도 있는 문제이니 천천히 생각하며 해결하기 바란다.

 

내 코드 ( 정답 아님 )

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



int main(void)
{
    char str1[51];
    char str2[51];

    char name1[51];
    char name2[51];

    int str1space = 0;
    int str2space = 0;
    int str1age = 0;
    int str2age = 0;

    printf("이름과 나이를 공백으로 구분하여 입력하세요. \n");
    printf("ex) 이민우 22\n");

    printf("입력 1 : ");
    gets(str1);
    printf("입력 2 : ");
    gets(str2);

    for(int i=0;str1[i]!='\0';i++){
        if(isspace(str1[i])!=0)
            str1space = i;
    }

    for(int i=0;str2[i]!='\0';i++){
        if(isspace(str2[i])!=0)
            str2space = i;
    }
    strncpy(name1,str1,str1space+1);
    strncpy(name2,str2,str2space+1);

    for(int i=str1space+1;i<sizeof(str1)/sizeof(char);i++){
        char age[40];
        age[i-str1space-1] = str1[i];
        str1age = atoi(age);
    }
    
    for(int i=str2space+1;i<sizeof(str2)/sizeof(char);i++){
        char age[40];
        age[i-str2space-1] = str2[i];
        str2age = atoi(age);
    }

    if(strncmp(name1,name2,48)==0){
        printf("이름이 같습니다.\n");
    }
    else{
        printf("이름이 다릅니다.\n");
    }

    if(str1age==str2age){
        printf("나이가 같습니다.\n");
    }
    else{
        printf("나이가 다릅니다.\n");
    }

    printf("%s\n",name1); // 변수 내의 값을 확인하기 위함.
    printf("%s\n",name2); // 변수 내의 값을 확인하기 위함.


    return 0;
}

두 번째 이름의 입력에서 한글이 자꾸만 깨진다. 이 문제점을 해결하지 못하였다.

 

 

정답

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

int GetspaceIdx(char str[])
{
    int len = 0;
    len = strlen(str);
    for(int i=0;i<len;i++){
        if(str[i]==" ")
            return i;
    }
}

int CompName(char str1[],char str2[]){
    int idx1 = GetspaceIdx(str1);
    int idx2 = GetspaceIdx(str2);

    if(idx1!=idx2)
        return 0;
    else
        return  !strncmp(str1,str2,idx1);
}

int CompAge(char str1[], char str2[])
{
    int idx1 = GetspaceIdx(str1);
    int idx2 = GetspaceIdx(str2);
    int age1 = 0, age2 = 0;
    
    age1 = atoi(&str1[idx1+1]);
    age2 = atoi(&str2[idx2+1]);

    if(age1==age2)
        return 1;
    else
        return 0;
}

int main(void){
    char str1[20];
    char str2[20];

    printf("첫 번째 사람 정보 입력 : ");
    fgets(str1,sizeof(str1),stdin);
    str1[strlen(str1)-1] = 0;

    printf("두 번째 사람 정보 입력 : ");
    fgets(str2,sizeof(str2),stdin);
    str2[strlen(str2)-1] = 0;

    if(CompName(str1,str2))
        puts("이름이 동일합니다!");
    else
        puts("이름이 동일하지 않습니다!");
    
    if(CompAge(str1,str2))
        puts("나이가 같습니다!");
    else
        puts("나이가 같지 않습니다!");

    return 0;
}

 

 

 

728x90
반응형
LIST