모노산달로스의 행보

[C programming] 표준 함수 본문

ProgrammingLanguage/C

[C programming] 표준 함수

모노산달로스 2024. 4. 16. 21:31

C programming - 표준 함수

 

 

리눅스 환경에서 네트워크 프로그래밍을 공부하기 위해서 C언어를 다시 복습해야 할 필요성을 느꼈습니다. 따라서 이번 기회에 배열부터 전처리기까지 내용들을 정리하겠습니다.


표준함수란?

출처 : https://unstop.com/blog/function-in-c

 

표준함수에 대해서 들어보셨나요? 그 의미는 정확히 몰라도 우리는 이미 그것을 여러 번 사용하고 있었습니다. 표준함수란 C언어 라이브러리에 저장되어 있어 사용자가 헤더파일을 통해 불러와 사용할 수 있는 함수입니다. 즉, 사용자가 필요한 기능이 미리 지정되어 있어 편하게 가져다 쓸 수 있는 것들입니다.

 

이번 포스트에서는 간편하게 대표적인 표준함수들에 대해서 소개하겠습니다.

 


gets() 함수와 puts() 함수

 

헤더파일 stdio.h에 속하는 두 함수는 문자열을 입력하고 출력하는 역할을 수행합니다.

#include<stdio.h>
char* gets (char* s)

 

gets() 함수는 사용자로부터 문자열을 입력받습니다. 이후 전달된 메모리 주소에 해당 문자열을 저장하는 함수입니다. 성공 시 입력된 문자열을 반환하고 실패하면 NULL포인터를 반환합니다.

 

Enter키 (개행 문자 \n)를 입력받으면 문자열 끝에 자동으로 종료문자(\0)를 붙입니다. 메모리 오버플로우를 방지하기 위해서는 문자열의 크기를 잘 할당해야 합니다.

 

#include<stdio.h>
int puts (const char* s)

 

puts() 함수는 전달된 메모리 주소의 문자열을 출력합니다. 성공하면 0 값 또는 0이 아닌 값을 반환합니다. 실패 시 EOF를 반환합니다. 문자열을 출력하면서 자동으로 Enter키 (개행 문자 \n)을 삽입합니다.

 

EOF란 파일의 끝을 의미합니다. stdio.h에 -1로 정의되어 있습니다. ctrl+z 입력 시 EOF로 인식됩니다.

 

 

다만 gets를 사용하는 경우 'gets' is deprecated라는 오류 메시지가 나타납니다. 이는 오래된 함수로써 gets함수 대신 fgets 혹은 sacnf 사용을 권장하는 의미입니다.

 


strlen() 함수

헤더파일 string.h에 속하는 함수로서 문자열의 길이를 알려줍니다. 문자열의 끝을 알리는 종료문자(\0)는 길이에 포함되지 않습니다.

#include<string.h>
size_t strlen (const char* s)

 

전달된 메모리 주소 array부터 종료문자를 만날 때까지 저장된 문자열의 길이를 반환합니다.

 

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

int main(void)
{
    char array1[] = "Hello C";
    char array2[] = "안녕하세요";

    printf("영문 문자열의 길이: %d \n", strlen(array1));
    printf("한글 문자열의 길이 %d \n", strlen(array2));

    printf("영문 문자열의 길이: %d \n", sizeof(array1)); 
    printf("한글 문자열의 길이: %d \n", sizeof(array2));
    
    return 0;
}

예제 코드의 출력 결과

 

strlen() 함수와 sizeof() 함수의 결과 값이 다른 것을 통해 종료 문자의 포함여부를 확인할 수 있습니다. 한글 문자열은 문자 하나당 3의 크기를 가집니다.

 

 

strcpy() 함수와 strncpy() 함수

헤더파일 string.h에 속하는 두 함수는 문자열을 복사하는 기능을 수행합니다.

#include<string.h>
char* strcpy (char* dest, const char* scr)

 

두 번째 인자의 문자열을 첫 번째 인자의 메모리 주소에 복사합니다. 성공 시 복사된 문자열의 시작 주소를 반환합니다.

 

#include<string.h>
char* strncpy (char* dest, const char* scr, size_t n)

 

strncpy() 함수 또한 같은 기능을 수행합니다. 두 번째 인자의 문자열을 첫 번째 인자의 메모리 주소에 복사합니다. 그리고 추가적으로 세 번째 인자로 복사될 크기를 지정할 수 있습니다. 성공 시 복사된 문자열의 시작 주소를 반환합니다.

 

 

strcat() 함수와 strncat() 함수

헤더파일 string.h에 속하는 두 함수는 두 문자열을 결합하는 기능을 수행합니다.

#include<string.h>
char* strcat (char* dest, const char* src)

 

두 번째 인자의 문자열을 첫 번째 인자의 메모리 주소에 결합합니다. 성공 시 결합된 문자열의 시작 주소를 반환합니다.

 

#include<string.h>
char* strncat (char* dest, const char* src, size_t n)

 

strncat() 함수 또한 같은 기능을 수행합니다. 두 번째 인자의 문자열을 첫 번째 인자의 메모리 주소에 결합합니다. 그리고 추가적으로 세 번째 인자로 결합할 크기를 지정할 수 있습니다. 성공 시 결합된 문자열의 시작 주소를 반환합니다.

 

 

strcmp() 함수와 strncmp() 함수

헤더파일 string.h에 속하는 두 함수는 문자열을 비교하는 기능을 수행합니다.

#include<string.h>
int strcmp (const char* s1, const char* s2)

 

첫 번째 인자의 문자열과 두 번째 인자의 문자열을 비교합니다. 성공 시 비교 결과를 반환합니다.

#include<string.h>
int strncmp (const char* s1, const char* s2, size_t n)

 

strncmp() 함수 또한 같은 기능을 수행합니다. 첫 번째 인자의 문자열과 두 번째 인자의 문자열을 비교합니다. 그리고 추가적으로 세 번째 인자로 결합할 크기를 지정할 수 있습니다. 성공 시 비교 결과를 반환합니다.

 

문자열의 비교 결과는 다음과 같은 방식으로 표현합니다.

  • 양수(0보다 큰 값) : array1의 문자열이 array2의 문자열보다 크다.
  • 0 : array1의 문자열이 array2의 문자열과 같다.
  • 음수(0보다 작은 값) : array1의 문자열이 array2의 문자열보다 작다.

 

strchr() 함수와 strstr() 함수

헤더파일 string.h에 속하는 두 함수 중 strchr() 함수는 문자의 위치를 찾는 기능을 수행하고 strstr() 함수는 문자열의 위치를 찾는 기능을 수행합니다.

 

#include<string.h>
char* strchr (const char* s, int c)

 

첫 번째 인자의 문자열에서 두 번째 인자의 문자가 어느 위치에 존재하는지 찾습니다. 성공 시 찾은 문자의 메모리 주소를 반환합니다.

 

#include<string.h>
char* strchr (const char* s1, const char* s2)

 

strstr() 함수 또한 비슷한 기능을 수행합니다. 첫 번째 인자의 문자열에서 두 번째 인자의 문자열이 어느 위치에 존재하는지 찾습니다. 성공 시 찾은 문자열의 메모리 주소를 반환합니다.

 

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

int main(void)
{
    char array1[50] = "Good-morning, Good-afternoon, Good-evening";
    char array2[10] = "morning";
    char* p1=NULL;
    char* p2=NULL;

    p1 = strchr(array1, 'a');
    p2 = strstr(array1, array2);

    printf("문자 a의 위치 : %x \n", p1);
    printf("문자열 : %s \n", p1);
    printf("문자열의 시작 문자 위치: %x \n", p2);
    printf("문자열 : %s \n", p2);

    return 0;
}

예제 코드의 출력 결과

 

strchr() 함수와 strstr() 함수를 통해 문자와 문자열의 주소 값을 얻어냈습니다. 해당 주소를 서식문자 %s를 통해 출력하면 해당 문자 혹은 문자열을 종료 문자를 만날 때까지 출력합니다.

 

sscanf() 함수와 sprintf() 함수

헤더파일 string.h에 속하는 두 함수는 배열로부터 문자열을 입력받고 출력하는 함수입니다.

 

#include<string.h>
int sscanf (const char * s1, const char * s2, ...);

 

sscanf() 함수는 첫 번째 인자의 문자열로부터 데이터를 가져옵니다. 가져온 데이터를 두 번째 인자부터 이어지는 변수 혹은 배열로 복사합니다.

 

#include<string.h>
int sprintf (char * s1, const char * s2, ...);

 

ssprintf() 함수 또한 비슷하게 작동합니다. 첫 번째 인자의 문자열에 두 번째 인자부터 이어지는 변수 혹은 배열로부터 데이터를 복사합니다.

 

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

int main(void)
{
    char array[50] = "100 3.14 good-morning";
    int num1;
    double num2;
    char str[50];

    sscanf(array,"%d %lf %s",&num1, &num2, str);
    puts("출력");
    printf("%d, %lf, %s \n", num1, num2, str);

    return 0;
}

예제 코드의 출력 결과

 

sscanf() 함수를 사용하여 array 함수에 저장된 100, 3.14 good-morning을 각각 변수와 배열에 저장할 수 있습니다.

 

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

int main(void)
{
    char array[50];
    int num1 = 100;
    double num2 = 3.14;
    char str[50] = "good-morning";

    printf("%d, %lf, %s \n", num1, num2, str);
    sprintf(array, "%d, %lf, %s \n", num1, num2, str);
    printf("%s \n",array);

    return 0;
}

예제 코드의 출력 결과

sprintf() 함수를 사용하여 array에 데이터를 입력하고 있습니다. 즉 두 함수를 통해서 array로부터 데이터를 입력받거나 array에 데이터를 입력하는 역할을 수행할 수 있습니다.

 

 


 

 

cf.

- ctype.h에 존재하는 함수

int isalnum (int c); 알파벳인지 숫자인지를 검사합니다
int isalpha (int c); 알파벳인지 아닌지를 검사합니다
int isdigit (int c); 숫자인지 아닌지를 검사합니다
int islower (int c); 소문자인지 아닌지를 검사합니다
int isupper (int c); 대문자인지 아닌지를 검사합니다
int isspace (int c); 공백 문자인지 아닌지를 검사합니다
int isxdigit (int c); 16진수인지 아닌지를 검사합니다
int tolower (int num); 문자를 소문자로 변환
int toupper (int num); 문자를 대문자로 변환

 

- stdlib.h에 존재하는 함수

double atof (const char* str); 문자열을 double형 데이터로 변환
int atoi (const char* str); 문자열을 int형 데이터로 변환
long atol (const char* str); 문자열을 long형 데이터로 변환

 

- math.h에 존재하는 함수

double ceil (double x); x보다 큰 정수 반환 (올림)
double floor (double x); x보다 작은 정수 반환 (내림)
double fabs (double x); x의 절댓값 반환
double pow (double x, double y); x의 y제곱 반환
double sqrt (double x); x의 루트를 씌운 값 반환
double exp (double x); e의 x제곱 반환 (e는 자연 상수)
double log (double x); x로 만들기 위한 e의 지수 값을 반환한다
double log10 (double x); x로 만들기 위한 10의 지수 값을 반환한다