티스토리 뷰

반응형


안녕하세요! 오늘 시간에는 저번 시간에 포스팅 했던 9장 포인터 Programming에 이어서 다음 장인 10장 문자와 문자열 문제들입니다. 기본적으로 사용한 툴은 비주얼 스튜디오 2017이고 9장 문제들에 대해서도 아래에 링크를 달아 놓았으니 참고하실 분은 활용해주시면 감사하겠습니다.


2018/11/21 - [IT 공부 및 일상] - C언어 콘서트 9장 포인터 Programming 문제


1번 문제

문자열을 저장하고 있는 문자형 배열의 각 인덱스 값에 접근해서 대문자로 바꿔줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#include<ctype.h>
 
void main(void) {
    char str[100];
    int count = 0;
 
    printf("텍스트를 입력하시오: ");
    gets(str);
 
    while (str[count] != '\0') {
        str[count] = toupper(str[count]);
        count++;
    }
 
    printf("대문자 출력: %s", str);
}
cs



2번 문제

scanf 함수에서 문자형 형식지정자를 %c로 지정해서 문자를 입력받고 출력할 때는 아스키 값을 위해 정수형 형식지정자인 %d로 지정해서 출력합니다.


1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
 
int main(void) {
    char input;
 
    printf("문자를 입력하시오: ");
    scanf("%c"&input);
    printf("문자의 아스키 값은 %d입니다.", input);
 
    return 0;
}
cs



3번 문제

아무런 값도 없이 비어있는 문자형 배열을 만들어서 strtok 함수로 분리시킨 단어들을 차례대로 strcat 함수를 사용해서 비어있는 문자형 배열에 이어 붙입니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<string.h>
 
int main(void) {
    char input_str[100];
    char del_emptyspace_str[100= "";
    char *token;
    char seps[] = " \t\n";
 
    printf("문자열을 입력하시오: ");
    gets(input_str);
 
    token = strtok(input_str, seps);
 
    while (token != NULL) {
        strcat(del_emptyspace_str, token);
        token = strtok(NULL, seps);
    }
 
    printf("공백이 사라진 문자열입니다.\n%s", del_emptyspace_str);
    return 0;
}
cs


아래의 코드블럭은 문자형 포인터 배열을 사용한 것으로 위의 13번째 줄까지는 동일합니다. 다만 분리된 단어의 주소를 가지고 있는 token 포인터 변수를 문자형 포인터 배열에 차례대로 대입하고 반복문을 통해서 공백이 없어진 문자열을 만든 것입니다.  


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<string.h>
 
int main(void) {
    char input_str[100];
    char del_emptyspace_str[100= "";
    char *separated_word[10];
    char *token;
    char seps[] = " \t\n";
    int count = 0;
 
    printf("문자열을 입력하시오: ");
    gets(input_str);
 
    token = strtok(input_str, seps);
 
    while (token != NULL) {
        separated_word[count] = token;
        count++;
        token = strtok(NULL, seps);
    }
 
    for (int i = 0; i < count; i++) {
        strcat(del_emptyspace_str, separated_word[i]);
    }
 
    printf("공백이 사라진 문자열입니다.\n%s", del_emptyspace_str);
    return 0;
}
cs



4번 문제

알파벳에 해당하는 문자형 배열과 각 알파벳 문자의 빈도수를 나타내는 정수형 배열을 선언하여 만약 입력한 문자열의 영문자가 알파벳을 저장하고 있는 배열의 원소와 일치할 경우 그 인덱스 값으로 빈도수를 나타내는 배열에 접근하여 해당하는 인덱스의 원소를 1씩 증가시키는 구조입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<string.h>
 
void main(void) {
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    char input_str[100];
    int alphabet_freq[26= { 0, };
 
    printf("문자열을 입력하시오: ");
    gets(input_str);    
 
    for (int i = 0; i < strlen(input_str); i++) {
        for (int j = 0; j < strlen(alphabet); j++) {
            if (input_str[i] == alphabet[j])
                alphabet_freq[j]++;
        }
    }
 
    for (int i = 0; i < strlen(alphabet); i++)
        printf("%c: %d\n", alphabet[i], alphabet_freq[i]);
}
cs



5번 문제

입력한 문자열의 첫 번째 문자와 마지막 문자에 접근하여 첫 번째 문자가 대문자인지 마지막 문자가 마침표인지 확인합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<ctype.h>
#include<string.h>
 
int main(void) {
    char input_str[100];
 
    printf("문자열을 입력하시오: ");
    gets(input_str);
 
    input_str[0= toupper(input_str[0]);
 
    if (input_str[strlen(input_str) - 1!= '.'
        strcat(input_str, ".\0");
 
    printf("교정된 문자열: %s", input_str);
 
    return 0;
}
cs



6번 문제

전체 문자열을 나타내는 배열을 만들고 뒤에 따라올 문자열을 만들어 놓고 입력한 문자열을 strcat 함수로 전체 문자열에 붙이고 뒤에 따라올 문자열을 붙인 형태입니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<string.h>
 
int main6(void) {
    char entire_str[200= "#include <stdio.h>\n\t";
    char followd_str[] = "\treturn 0;\n}";
    char input_str[100];
    char *str_array[2];
 
    printf("문장을 입력하시오: ");
    fgets(input_str, sizeof(input_str), stdin);
 
    strcat(entire_str, input_str);
    strcat(entire_str, followd_str);
 
    printf("전체 프로그램:\n%s", entire_str);
 
    return 0;
}
cs



7번 문제

사용자가 문자를 하나하나 입력하여 목표 문자열을 맞추는 게임으로 횟수는 13번으로 지정해서 그 수 안에 맞춰야 하고 입력버퍼에 '\n'가 남아있는 현상을 rewind(stdin)으로 해결하였습니다. 원래 fflush(stdin)도 시도해보았지만 해결되지가 않아서 아무래도 비주얼 스튜디오 2017 컴파일러과 호환이 안되는 모양인 것 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<string.h>
 
void main(void) {
    char Game_str[] = "wheel of fortune";
    char Display_str[] = "_____ __ _______";
    char user_input;
    int count;
 
    for (count = 1; count <= 13; count++) {
        printf("문제: %s\n", Display_str);
        printf("글자를 추측하시오: ");
        user_input = getchar();
        rewind(stdin);
 
        for (int i = 0; i < strlen(Game_str); i++) {
            if (user_input == Game_str[i]) 
                Display_str[i] = user_input;
        }
 
        if (strcmp(Game_str, Display_str) == 0) {
            printf("%s\n", Display_str);
            printf("%d번만에 성공하셨습니다.\n축하드립니다!\n", count);
            break;
        }
    }
}
cs



8번 문제

입력한 문자열 중에서 공백이면 문자를 기다리는 상태로 waiting 변수에 1을 주고 만약 문자를 만나면 더 이상 기다리지 않아도 된다는 표시로 waiting에 0을 대입하고 문자인지 공백인지는 isalpha 함수와 if 문을 사용해서 구현하였습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<string.h>
#include<ctype.h>
 
int main(void) {
    char str[100];
    char waiting = 1;
    int word_count = 0;
 
    printf("텍스트를 입력하시오: ");
    gets(str);
 
    for (int i = 0; i < strlen(str); i++) {
        if (isalpha(str[i])) {
            if (waiting) {
                word_count++;
                waiting = 0;
            }
        }
        else waiting = 1;
    }
    
    printf("단어의 개수는 %d입니다.", word_count);
 
    return 0;
}
cs



9번 문제

strtok 함수를 사용해서 문자열에서 분리자를 통해 단어들을 분리시켜서 찾는 문자열과 비교를 시키고 만약 일치할 경우 바꿀 문자열의 주소를 char형 포인터 배열에 대입을 시키고 일치하지 않을 경우에는 원래 단어의 주소를 대입시킵니다. 그런 다음 반복문을 통해서 비어있는 문자형 배열에 strcat 함수를 사용해 차례대로 문자열을 덧붙입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<stdio.h>
#include<string.h>
 
char seps[] = " ";
char *token;
 
void main(void) {
    char str[81];
    char ToSearch[11];
    char ToChange[11];
    char After_str[81= "";
    char *after_str[20];
    int count = 0, finalnum;
    
    printf("문자열을 입력하시오: ");
    gets(str);
    printf("찾을 문자열: ");
    gets(ToSearch);
    printf("바꿀 문자열: ");
    gets(ToChange);
 
    token = strtok(str, seps);
 
    while (token != '\0') {
        if (strcmp(ToSearch, token) == 0)
            token = ToChange;
        
        after_str[count] = token;
        count++;
        token = strtok(NULL, seps);
    }
 
    finalnum = count;    
    
    for (int i = 0; i < finalnum; i++) {
        strcat(After_str, after_str[i]);
        strcat(After_str, " ");
    }
 
    printf("결과: %s", After_str);
}
cs


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함