본문 바로가기

프로그램언어/C언어

c언어 표준 함수

수학 함수 (math.h)

 

double sqrt(double x);               //  x의 제곱근을 반환
double log(double x);                //  자연로그 x의 값을 반환
double exp(double x);                // 무리수 e의 x제곱을 반환
double pow(double x, double y);  //  x의 y제곱의 값을 반환
double sin(double x);                 //  x의 사인값을 반환
double cos(double x);                //  x의 코사인 값을 반환
double tan(double x);                //  x의 탄제트 값을 반환

 

소스코드 실행 결과

#include <stdio.h>
#include <math.h>

#define PI 3.141592

int main() {
    printf("sqrt(25.0) : %g\n", sqrt(25.0));
    printf("log(10) : %g\n", log(10.0));
    printf("exp(10) : %g\n", exp(2.0));
    printf("pow(10) : %g\n", pow(4.0, 3));
    printf("sin(10) : %g\n", sin(PI / 6));
    printf("cos(10) : %g\n", cos(PI / 5));
    printf("tan(10) : %g\n", tan(PI / 4));

 

    return 0;
}

sqrt(25.0) : 5
log(10) : 2.30259
exp(10) : 7.38906
pow(10) : 64
sin(10) : 0.5
cos(10) : 0.809017
tan(10) : 1

 

문자열 함수 (string.h)


char *strcpy(char *dest, char *src);                      //문자열 복사
char *strncpy(char *dest, char *src, unsigned n);    //지정한 길이만큼 문자열 복사
unsigned strlen(char *str);                                //문자열 길이 반환
int strcmp(char *s1, char *s2);                           //문자열 비교 대소문가 구분
int stricmp(char *s1, char *s2);                          //문자열 비교 대소문자 구분안함
문자열 s1 > 문자열 s2  => 1
문자열 s1 == 문자열 s2  => 0
문자열 s1 < 문자열 s2  => -1
char *strupr(char *str);                                   //모두 대문자로
char *strlwr(char *str);                                   //모두 소문자로
str *strchr(char *str, char c);                            //문자열 조사(앞에서 뒤로)
char *strstr(char *str1, char *str2);                    //문자열 조사(대소문자 구분)
char *strcat(char *dest, char *src);                    //문자열 추가
char *strncat(char *dest, char *src, unsigned n);   //문자열을 n문자만큼 추가

 

소스코드

#include <stdio.h>
#include <string.h>
int main() {
    char str1[10] = "abcdefg";
    char str2[10] = "1234567";
    char temp1[10], temp2[10];
    char *str3, *str4;
    int n;


    strcpy(temp1, str1);
    printf("문자복사 %s\n", temp1);
    strncpy(temp2, str2, 3);
    temp2[3] = '\0';
    printf("문자복사 %s\n\n", temp2);

    n = strlen(str1);
    printf("문자열의 길이 : %d\n\n", n);

    printf("문자열의 비교 : %d (뒤쪽이 큼, 대소문자 구분함)\n", strcmp("abc", "abcd"));
    printf("문자열의 비교 : %d (같음, 대소문자 구분함)\n", strcmp("abc", "abc"));
    printf("문자열의 비교 : %d (앞쪽이 큼, 대소문자 구분함)\n", strcmp("abcd", "abc"));
    printf("문자열의 비교 : %d (대소문자 구분안함)\n\n", stricmp("ABCD", "abcd"));

    str3 = strupr(temp1);
    printf("대문자 : %s\n", str3);
    str4 = strlwr(str1);
    printf("소문자 : %s\n\n", str4);

    return 0;
}

 

실행 결과]

문자복사 abcdefg
문자복사 123

문자열의 길이 : 7

문자열의 비교 : -1 (뒤쪽이 큼, 대소문자 구분함)
문자열의 비교 : 0 (같음, 대소문자 구분함)
문자열의 비교 : 1 (앞쪽이 큼, 대소문자 구분함)
문자열의 비교 : 0 (대소문자 구분안함)

대문자 : ABCDEFG
소문자 : abcdefg

소스코드 소스코드

#include <stdio.h>
#include <string.h>
int main() { 

char str1[30] = "abcdefghijklmn";
char str2[30];
char *str3;

    str3 = strchr(str1, 'c');
    printf("%s \n", str3);

    str3 = strchr(str1, 0x67);   //0x67 = 'g'
    printf("%s \n", str3);

    str3 = strrchr(str1, 'k'); //뒤에서 앞으로 검색
   printf("%s \n", str3);

   return 0; 
}

 

실행 결과]

cdefghijklmn
ghijklmn
klmn

#include <stdio.h>
#include <string.h>
int main() { 

    char str1[100] = "abcdefg";
    char str2[10] = "1234567";

    char str3[100] = "abcd";
    char str4[10] = "1234567";

    strcat(str1, str2);
    puts(str1);

    strncat(str3, str4, 3);
    puts(str3);

   return 0; 

}

 

실행 결과]

abcdefg1234567
abcd123

 

난수함수 (stdlib.h)


int rand();                                      //0~32767(RAND_MAX) 사이의 정수 난수
void srand(unsigned int seed);            //난수 발생 씨앗을 seed로 초기화한다.
srand(time(NULL));                           //time(NULL)함수는 현재의 시스템 날짜와 시간의 초를 구함
int atoi(char *s);                              //문자열 s를 int형 정수로 변환
double atof(char *s);                        //문자열 s를 double형 실수로 변환
char *itoa(int x, char *str, int radix);     //숫자를 문자열로 변환

소스코드 소스코드

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

#include <time.h>


int main() { 

    int n;
    // 실행시 마다 다른 계열의 난수가 발생되게 한다.
    srand(time(NULL));

    //처음 난수는 버린고 시작하기 위해
    n = 45 * rand() / RAND_MAX + 1;
    //1~45 사이의 정수 난수 10개 를 출력
    for (int i = 1; i <= 10; i++)
    {
        n = 45 * rand() / RAND_MAX + 1;
         printf("%d ", n);
     }

   return 0; 
}

 

실행 결과]

2 34 30 12 23 14 8 24 35 8

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


int main() { 

    char str[10] = "1234";
    int n;
    double k;

    n = atoi(str);
    k = atoi(str);

    printf("문자를 정수로 : %d\n", n);
    printf("문자를 실수로 : %f\n\n", k);

    itoa(n, str, 10);
    printf("정수를 문자10진수로 : %s\n", str);
    itoa(n, str, 8);
    printf("정수를 문자8진수로 : %s\n", str);
    itoa(n, str, 16);
    printf("정수를 문자16진수로 : %s\n", str);

    return 0; 
}

 

실행 결과]

문자를 정수로 : 1234
문자를 실수로 : 1234.000000

정수를 문자10진수로 : 1234
정수를 문자8진수로 : 2322
정수를 문자16진수로 : 4d2

 

메모리 할당 함수 (malloc.h)
void *malloc(int n);                      //메모리중에 n바이트를 할당
void free(void *ptr);                     //포인터 ptr에 할당되어 있는 메모리를 해제

소스코드 실행결과

#include <stdio.h>
#include <malloc.h>

#include <string.h>


int main() { 

    char *str;

    str = (char *)malloc(10);
    strcpy(str, "asdf");
    printf("%s\n", str);
    free(str);

    return 0; 
}

asdf

 

문제풀어 보기]

 

1. 다음 직각 삼각형의 밑변m과 높이 n을 구하라. (빗변:100, 사이각:25°)
n/100 -> sin(25*PI/180)
m/100 -> cos(25*PI/180)

출력 예]
높이 : 42.3
밑변 : 90.6


2. 2의 1승부터  2의 10승까지 출력하는 프로그램을 작성하시오. (pow함수 사용)

출력 예]
2의 1승 : 2
2의 2승 : 4
2의 3승 : 8
2의 4승 : 16
2의 5승 : 32
2의 6승 : 64
2의 7승 : 128
2의 8승 : 256
2의 9승 : 512
2의 10승 : 1024


3. 두 개의 단어를 입력받아 길이가 긴 문자열을 출력하시오. (단 문자열의 길이는 100이하)
입력 예]
computer C++

출력 예]
computer


4. 문자열(100자 이하)을 입력받은 후 정수를 입력받아 해당위치의 문자를 제거하고 출력하는 작업을 반복하다가 문자 1개가 남으면 종료하는 프로그램을 작성하시오.
첫 번째 문자의 위치는 1이며 만약 입력받은 번호가 문자열의 길이 이상이면 마지막 문자를 제거한다. 
입력 예]
word
3
1
10

출력 예]
wod
od
o


5. 공백을 포함한 문자열을 입력받아 다음과 같이 분리하여 번호와 함께 출력하는 프로그램을 작성하시오. 문자열의 길이는 100자 이하이다.
입력 예]
My name is Dunsancom

출력 예]
1. My
2. name
3. is
4. Dunsancom


6. 단어를 입력받다가 "0"을 입력받으면 입력을 종료하고 그 때까지 입력받은 단어의 개수를 출력하고 홀수 번째 입력받은 단어를 한 줄에 1개씩 출력하는 프로그램을 작성하시오. 단어의 개수는 50개를 넘지 않고, 단어의 길이는 100자 이하이다.
입력 예]
January
february
march
0

출력 예]
3
January
march


7. 10 이하의 정수 n을 입력받고 n개의 문자열을 입력받은 후 그 크기를 비교하여 가장 작은 문자열부터 차례로 출력하는 프로그램을 작성하시오. 문자열의 길이는 100자 이하다. 사전순(아스키코드순)으로 뒤에 나오는 것을 큰 것으로 한다.
입력 예]
3
window
linux
ms-dos

출력 예]
linux
ms-dos
window


8. 5개의 단어(각 단어는 100자 이하)를 입력받은 후 문자와 문자열(100자 이하)을 한 개씩 입력받아 나중에 입력받은 문자나 문자열이 포함된 단어를 모두 출력하는 프로그램을 작성하시오. 찾는 단어가 없으면 “없음”이라고 출력한다.
입력 예]
banana
apple
melon
tomato
pear
n
to

출력 예]
banana
melon
tomato


9. 두 개의 문자열 A와 B 한 개의 정수 n을 입력받아서 A에 B를 연결하고 A에서 n개의 문자를 B에 복사한 후 A와 B를 출력하는 프로그램을 작성하시오. (1≤n,A,B≤100)
입력 예]
tomato melon 3

출력 예]
tomatomelon
tomon


10. 한 개의 단어를 입력받아서 거꾸로 뒤집어 출력하는 작업을 반복하다가 "END"라고 입력이 되면 종료하는 프로그램을 작성하시오. (strrev()함수 문자열 거꾸로 뒤집는 함수)
입력받는 단어의 길이는 20이하이다.

입력 예] 출력 예]
Jungol lognuJ
jjang gnajj
END



11. 1 ~ 10이하의 숫자 난수를 50번 발생시켜 각각의 숫자의 개수를 출력하시오.

출력 예]
 1번 :  6개
 2번 :  5개
 3번 :  4개
 4번 :  5개
 5번 :  7개
 6번 :  7개
 7번 :  5개
 8번 :  2개
 9번 :  5개
10번 :  4개


12. 10 ~ 100 사이의 난수 10개를 발생시켜 평균에 가장 가까운 수를 출력 하시오.

출력 예]

22 50 14 98 80 74 65 74 86 57

평균 : 62.0
가장 가까운 수 : 65


13. 다음과 같은 프로그램을 작성하시오. ( 메모리 할당 : malloc(), 해제 : free() 사용 )
   1) 문자열을 입력받는다. (포인터 변수 메모리 할당)
   2) 문자열의 문자수를 구한다.
   3) 문자열의 문자수 + 1 바이트를 할당 한다. (포인터 변수 메모리 할당)
   4) 입력된 문자열을 할당된 영역에 복사한다.
   5) 복사된 문자열을 출력한다.

입력 예]
computer

출력 예]
computer

'프로그램언어 > C언어' 카테고리의 다른 글

c언어 scanf 에러 발생  (0) 2019.10.10
c언어 파일 입출력  (0) 2019.10.08
c언어 구조체와 공용체  (0) 2019.10.07
c언어 사용자 정의 함수  (0) 2019.10.04
c언어 포인터  (0) 2019.10.02