본문 바로가기
College Computer Science/C Language

[C 프로그래밍 실습] 문자와 문자열 (Lab 07)

by 2den 2021. 1. 3.
728x90

<Lab 07 문제 유형 요약>

 

  • Program 1 : mystrlen() - strlen() 구현 (문자열 길이 구하는 함수)
  • Program 2 : mystrcat() - strcat() 구현 (문자열 합치는 함수)
  • Program 3 : delchar() 구현 (문자열에서 특정 문자를 삭제하는 함수)
  • Program 4 : tolower(), toupper() (대문자 소문자 변환하는 함수)
  • Program 5 : myatoi() - atoi() 구현 (문자열 정수로 변환하는 함수)
  • Program 6 : myatoi(), 명령행 인자
  • Program 7 : strlwr(), strpbrk(), strstr(), strchr()
  • Program 8 : strtok(), 문장 문자열 자르기, 배열에 단어 저장

 


 

Program 1

 

한 행을 표준입력으로 입력 받은 문자열의 길이를 구하는 함수 mystrlen()을 구현하여 라이브러리 strlen()과 결과를 비교하는 프로그램을 작성하시오.

 

  • int mystrlen(const char *p);
  • 한 행을 표준입력으로 입력 받는 것은 라이브러리 gets() 사용

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

int mystrlen(const char* p)
{
	int cnt = 0;
	for (int i = 0; *(p + i); i++) {
		cnt++;
	}
	return cnt;
}

int main()
{
	char* string;
	printf("Enter any string >> ");
	gets(string);
	printf("strlen() : %d\n", strlen(string));
	printf("mystrlen() : %d\n", mystrlen(string));

	return 0;
}

 

 

Program 2

 

앞의 문자열에 뒤 문자열을 연결하는 함수 mystrcat()를 구현하여 라이브러리 함수 strcat() 과 결과를 비교해 보시오.

 

  • void mystrcat(char s1[], const char s2[]) : 라이브러리 strcat()와 같이 s1 뒤에 s2를 붙여 연결하는 함수   

char s1[50] = "C ";

char s2[50] = "C ";

char *s3 = "programming language";

strcat(s1, s3);

mystrcat(s2, s3);

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

char* mystrcat(char* str1, char* str2)
{
	int str1len = strlen(str1);
	for (int i = 0; *(str2 + i); i++)
	{
		*(str1 + str1len + i) = *(str2 + i);
	}
	return str1;
}

int main()
{
	char s1[50] = "C ";
	char s2[50] = "C ";
	char* s3 = "programming language";

	printf("%s\n", s1);
	printf("%s\n", s3);
	printf("strcat() : %s\n", strcat(s1, s3));
	printf("mystrcat() : %s\n", mystrcat(s2, s3));

	return 0;
}

 

 

Program 3

 

표준입력으로 받은 문자열에서 특정 문자를 삭제하는 함수 delchar()를 구현하시오. 그리고 함수 delchar()를 호출하여 수행하고 결과를 출력하는 프로그램을 작성하시오.

 

  • void delchar(char str[], const char ch) : str에서 문자 ch를 삭제한 문자열을 반영하는 함수

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

void delchar(char str[], const char ch)
{
	for (int i = 0; *(str + i); i++)
	{
		if (*(str + i) == ch)
		{
			strcpy(str + i, str + i + 1);
			i--;
		}
	}
}

int main()
{
	char* string;
	char del;
	printf("input : ");
	gets(string);
	printf("delete : ");
	scanf("%c", &del);

	delchar(string, del);
	printf("result : %s\n", string);
	return 0;
}

 

 

Program 4

 

한 줄의 문자열을 표준입력으로 입력 받아 영문자의 대문자는 소문자로, 소문자는 대문자로 변환하여 출력하는 프로그램을 작성하시오.

 

  • 함수 tolower() toupper()를 이용

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

int main()
{
	char* sentence;
	printf("sentence : ");
	gets(sentence);

	for (int i = 0; *(sentence + i); i++)
	{
		if ('a' <= *(sentence + i) && *(sentence + i) <= 'z')
		{
			*(sentence + i) = toupper(*(sentence + i));
		}
		else if ('A' <= *(sentence + i) && *(sentence + i) <= 'Z')
		{
			*(sentence + i) = tolower(*(sentence + i));
		}
	}

	printf("result : %s\n", sentence);
	return 0;
}

 

 

Program 5

 

다음 내용을 참고로, 정수 형태의 문자열을 정수로 반환하는 함수를 구현하고 결과를 알아보는 프로그램을 작성하시오.

 

  • 문자열 ”76843”은 정수 76843으로, 다음 두 함수에 대하여 모두 출력
  • 라이브러리 함수 atoi()를 사용해 출력, 함수 atoi()의 함수원형은 stdlib.h에 정의되어 있으며 문자열 str을 정수로 변환하는 함수  int atoi(const char *str);
  • 직접 구현한 함수 myatoi()도 동일하게 출력  int myatoi(const char *str);
  • 다른 라이브러리 함수 사용 가능(isdigit, pow )

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

int myatoi(const char* str)
{
	int result = 0;
	for (int i = 0; *(str + i); i++)
	{
		result = result * 10 + *(str + i) - '0';
	}
	return result;
}

int main()
{
	char* intstr;
	printf("integer : ");
	gets(intstr);

	printf("atoi() : %d\n", atoi(intstr));
	printf("myatoi() : %d\n", myatoi(intstr));

	return 0;
}

 

 

Program 6

 

5번 문제에서 직접 구현한 함수 myatoi()를 이용하여 명령행에 입력된 두 정수를 더한 결과를 출력하는 프로그램을 작성하시오.

 

  • addcmdarg,c 파일을 컴파일하여 addcmdarg.exe 파일이 만들어서 dos(cmd 명령어 사용) 에서 실행한 경우
  • IDE(VisualStudio, Dev C++) 에서 인자를 입력하지 않은 경우
  • IDE 에서 인자를 100 200을 입력한 경우

#include<stdio.h>

int myatoi(const char* str)
{
	int result = 0;
	for (int i = 0; *(str + i); i++)
	{
		result = result * 10 + *(str + i) - '0';
	}
	return result;
}


int main(int argc, char* argv[])
{
	printf("result : %s + %s = %d\n", argv[1], argv[2], myatoi(argv[1]) + myatoi(argv[2]));

	return 0;
}

 

 

Program 7

 

다음에서 설명하고 있는 함수의 기능을 이해하기 위하여 각각 함수의 사용하는 예제를 프로그램하시오.

 

  • strlwr() : 문자열 str을 모두 소문자로 변환하고 변환한 문자열을 반환
  • strpbrk() : 앞의 문자열 str에서 뒤 문자열 charset에 포함된 문자가 나타나는 처음 위치를 찾아 그 주소 값을 반환하며, 만일 찾지 못하면 null 포인터를 반환
  • strstr() : 앞의 문자열 str에서 뒤 문자열 strsearch이 나타나는 처음 위치를 찾아 그 주소 값을 반환, 만일 찾지 못하면 NULL 포인터를 반환
  • strchr() : 앞의 문자열 str에서 뒤 문자 ch가 나타나는 처음 위치를 찾아 그 주소 값을 반환, 만일 찾지 못하면 NULL 포인터를 반환

char str[] = "C Code & C++ code" ;

char str1[20];

char str2[] = "&+" ;

char str3[] = "code" ;

char ch = 'd';

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

int main()
{
	char str1[20] = "C Code & C++ code";
	char str2[] = "&+";
	char str3[] = "code";
	char ch = 'd';

	printf("strlwr(str1) : %s\n", strlwr(str1));
	printf("strpbrk(str1, str2) : %s\n", strpbrk(str1, str2));
	printf("strstr(str1, str3) : %s\n", strstr(str1, str3));
	printf("strchr(str1, ch) : %s\n", strchr(str1, ch));

	return 0;
}

 

 

Program 8

 

주어진 문장으로부터 단어를 추출하여 배열에 저장하고, 배열에 저장된 단어를 출력하는 프로그램을 쓰시오.

 

  • strtok() 함수 사용하면 편리
  • char str[] = "C and C++ languages are good!, Java and python languages are best?";

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

int main()
{
    char str[] = "C and C++ languages are good!, Java and python languages are the best?";
    char* p = strtok(str, " ");

    while (p)
    {
        printf("%s\n", p);
        p = strtok(NULL, " ");
    }

    return 0;
}

 

728x90

댓글