study/C언어

[c언어] 입출력 정리

IT공부 2020. 4. 2. 20:16
반응형

 

printf("\'Hello \'"); //작은따옴표 표시
printf("\"Hello \""); //큰따옴표 표시 
scanf("%1d %1d %1d %1d %1d",&a, &b, &c, &d, &e); //1개의 정수씩 변수에 저장한다.
scanf("%u", &n) //unsigned int 입력받으려면 %u를 사용한다. 
scanf("lf", &n) //double(long float) 형식으로 입력
%.11lf를 사용하면 소수점 이하 11자리까지 출력된다. 

fgets()를 사용하면 공백 문자가 포함되어있는 문장을 입력받아 저장할 수 있다. 
만약, 아래처럼 
scanf("%s",...)를 이용해 문장을 입력받으면, 첫 번째 단어까지만 저장된다

char data[2001];
fgets(data, 2000, stdin);
printf("%s", data);

 



스트림(Stream)

C프로그램은 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림이라는 것을 통해 다룬다. 
스트림이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다. 
즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미



getchar(), fgetc() 

C에서 하나의 문자를 입력받을 때는 getchar() 함수나 fgetc() 함수를 사용 

getchar() 함수와는 달리 문자를 입력받을 인수로 전달하여 직접 지정가능 
따라서 fgetc() 함수는 키보드 뿐 만 아니라 파일을 통해서 문자를 입력받을 수 있다. 

getchar() fgetc()
#include <stdio.h> #include <stdio.h>
int getchar(void);  int fgetc(FILE *stream) 

 


putchar() fputc() 

putchar()  fputc()
#include <stdio.h> #include <stdio.h> 
int putchar(int c); int fputc(int c, FILE *stream) 

 



문자열 입력 함수 

fgets() 함수를 사용 

fgets() 함수는 키보드뿐만 아니라 파일에서도 문자열을 입력받을 수 있는 함수입니다. 

fget()  
#include <stdio.h>    
char *fgets(char * restrict s, int n, FILE * restrict stream);    


fgets() 함수

첫 번째 인수는 입력받는 문자열을 저장하기 위해 선언한 배열의 시작 주소를 전달합니다. 
두 번째 인수로는 입력받을 수 있는 문자열의 최대 길이를 전달하고, 

마지막 인수로는 문자열을 입력받을 스트림을 전달합니다. 



문자열 출력 함수 


puts()함수나 fputs() 함수를 사용합니다.


put() 함수 

puts() 함수는 표준 출력 스트림(stdout)인 모니터에 하나의 문자열을 출력하는 함수입니다. 
이 함수는 모니터에 문자열을 출력한 다음에 자동으로 줄을 바꿔줍니다. 

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


puts() 함수는 인수로 출력할 문자열을 가리키는 포인터를 전달합니다. 



fputs() 함수


fputs() 함수는 모니터뿐만 아니라 파일을 통해서도 문자를 출력할 수 있는 함수입니다. 
이 함수는 puts() 함수와는 달리 문자열을 출력한 다음에 자동으로 줄을 바꿔주지 않습니다. 

fpus()  
#include <stdio.h>  
int fputs(const char * restrict s, FILE * restrict stream);   


fputs() 함수

첫 번째 인수는 출력할 문자열을 가르키는 포인터를 전달합니다. 
두 번째 인수로는 문자열을 출력할 스트림을 전달합니다. 



문자열 처리 함수

1. strlen() 함수


2. strcat(), strncat() 함수


3. strcpy(), strncpy() 함수


4. strcmp(), strncmp() 함수


5. atoi(), atol(), atoll(), atof() 함수


6. toupper(), tolower() 함수



strlen() 함수

strlen() 함수는 인수로 전달된 문자열의 길이를 반환하는 함수입니다.
이때 문자열 여부를 구분하는 마지막 문자인 널 문자는 문자열의 길이에서 제외됩니다.

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


char str[] = "C언어";  
printf("이 문자열의 길이는 %d입니다.\n", strlen(str));



strcat() 함수와 strncat() 함수


strcat()함수와 strncat() 함수는 하나의 문자열에 다른 문자열을 연결해주는 함수입니다.

 

strcat()  strncat()
#include <string.h> #include <string.h>
char *strcat(char * restrict s1, const char * restrict s2);  char *strncat(char * restrict s1, const char * restrict s2, size_t n);   


strcat() 함수

첫 번째 인수로 전달된 문자열은 기준 문자열이 됩니다.
두 번째 인수로 전달된 추가하고자 하는 문자열의 복사본이 기준 문자열 뒤에 추가됩니다.


이때 기준 문자열이 저장된 배열의 공간이 충분하지 않으면, 배열을 채우고 남은 문자들이 배열 외부로 흘러 넘 칠 수 있습니다.

 

이러한 현상을 배열 오버플로우(overflow)라고 합니다.

배열 오버플로우 현상을 방지하기 위해서는 strcat() 함수 대신에 strncat() 함수를 사용하는 것이 좋습니다.

 
strncat() 함수는 strcat() 함수와 하는 일은 같지만, 

세 번째 인수로 추가할 문자열의 최대 길이를 지정할 수 있습니다.

 

이 함수는 널 문자를 만나거나, 추가하는 문자의 개수가 세 번째 인수로 전달된 최대 길이에 도달할 때까지 추가를 계속합니다.

char str01[20] = "C language is "; // 널 문자를 포함하여 15문자 
char str02[] = "Cool! and funny!";   
//strcat(str01, str02);   // 이 부분의 주석 처리를 삭제한 후 실행시키면 배열 오버플로우우가 발생함 
strncat(str01, str02, 5); // 이렇게 최대 허용치를 설정해 놓으면 배열 오버플로우우에 대해서는 안전해짐 
puts(str01); 


strcpy() 함수와 strncpy() 함수


strcpy() 함수와 strncpy() 함수는 문자열을 복사하는 함수입니다.

strcpy()  strncpy() 
#include <string.h> #include <string.h>
char *strcpy(char * restrict s1, const char * restrict s2);    char *strncpy(char * restrict s1, const char * restrict s2, size_t n);    


strcpy() 함수

 

첫 번째 인수로 전달된 배열에, 두 번째 인수로 전달된 문자열을 복사합니다.

하지만 이때 첫 번째 인수로 전달된 배열의 크기가 복사할 문자열의 길이보다 작으면, 배열 오버플로우가 발생합니다.

배열 오버플로우 현상을 방지하기 위해서는 strcpy() 함수 대신에 strncpy() 함수를 사용하는 것이 좋습니다.

 
strncpy() 함수는 strcpy() 함수와 하는 일은 같지만, 세 번째 인수로 복사할 문자열의 최대 길이를 지정할 수 있습니다.

이 함수는 널 문자를 만나거나, 복사하는 문자의 개수가 세 번째 인수로 전달된 최대 길이에 도달할 때까지 복사를 계속합니다.

char str01[20] = "C is Cool!"; 
char str02[11];   
// str02 배열의 크기만큼만 복사를 진행하며, 마지막 한 문자는 널 문자를 위한 것임 
strncpy(str02, str01, sizeof(str02)-1); 
str02[sizeof(str02)-1] = '\0'; // 이 부분을 주석 처리하면, 맨 마지막에 널 문자를 삽입하지 않음 
puts(str02); 


다음 예제는 strncpy() 함수를 이용하여 문자열의 일부분만을 수정하는 예제입니다.

strncpy() 함수의 첫 번째 인수에 배열 이름을 이용한 포인터 연산을 사용하여 수정을 시작할 지점을 지정할 수 있습니다.

char str[20] = "C is cool!";  
strncpy(str+5, "nice", 4); // 배열 이름을 이용한 포인터 연산으로 수정할 부분의 시작 부분을 지정함 
puts(str); 
실행 결과 
C is nice! 


strcmp() 함수와 strncmp() 함수


strcmp() 함수와 strncmp() 함수는 문자열의 내용을 비교하는 함수입니다.

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


strcmp() 함수는 인수로 두 개의 문자열 포인터를 전달받아, 해당 포인터가 가리키는 문자열의 내용을 서로 비교합니다.

두 문자열의 모든 문자는 아스키 코드값으로 자동 변환되며, 문자열의 맨 앞에서부터 순서대로 비교됩니다.

 
strcmp() 함수의 상황별 반환값은 다음과 같습니다.

반환값  설명
양수  첫 번째 인수로 전달된 문자열이 더 큰 경우 
두 문자열의 내용이 완전히 같은 경우 
음수  두 번째 인수로 전달된 문자열이 더 큰 경우임. 


strncmp() 함수는 strcmp() 함수와 하는 일은 같지만, 세 번째 인수로 비교할 문자의 개수를 지정할 수 있습니다.

이 함수는 일치하지 않는 문자를 만나거나, 세 번째 인수로 전달된 문자의 개수만큼 비교를 계속합니다.

 


다음 예제는 strcmp() 함수를 이용하여 두 문자열을 비교하는 예제입니다.

strcmp() 함수는 문자열을 비교하는 함수이므로, 문자를 비교할 때에는 관계 연산자 '=='를 사용해야 합니다.


#include  

#include    

int main(void) 

{ 

    char str[20]; 

    char ch;   

  

    while (1) 

    { 

        puts("미국의 수도를 입력하세요 :"); 

        scanf("%s", str); 

        if (strcmp(str, "워싱턴") == 0 || strcmp(str, "washington") == 0) // 문자열의 비교 

        { 

            puts("정답입니다!"); 

            break; 

        } 

        else 

            puts("아쉽네요~"); 

        fflush(stdin);   

  

        puts("\n이 프로그램을 끝내고자 한다면 'q'를 눌러주세요!"); 

        puts("계속 도전하고자 하시면 Enter를 눌러주세요!"); 

        scanf("%c", &ch);   

        if (ch == 'q') // 문자의 비교 

        { 

            break; 

        } 

        fflush(stdin); 

    } 

    return 0; 

} 


atoi(), atol(), atoll(), atof() 함수


이 함수들은 인수로 전달된 문자열을 해당 타입의 숫자로 변환시켜주는 함수입니다.

 

atoi(), atol(), atoll(), atof() 함수의 원형은 각각 다음과 같습니다.

#include <stdlib.h>
int atoi(const char *nptr);            // int형 정수로 변환함. 
long int atol(const char *nptr);       // long형 정수로 변환함. 
long long int atoll(const char *nptr); // long long형 정수로 변환함. 
double atof(const char *nptr);         // double형 실수로 변환함.   


다음 예제는 숫자로 이루어진 문자열을 숫자로 변환하여, 곱셈 연산을 수행하는 예제입니다.

char str01[] = "10"; 
char str02[] = "20";   
printf("문자열을 숫자로 변환해서 곱한 값은 %d입니다.\n", atoi(str01) * atoi(str02)); 
실행 결과 
문자열을 숫자로 변환해서 곱한 값은 200입니다. 

toupper() 함수와 tolower() 함수


이 함수들은 인수로 전달된 문자열의 영문자를 모두 대문자나 소문자로 변환시켜주는 함수입니다.

 

#include <ctype.h>
int toupper(int c); // 문자열의 모든 영문자를 대문자로 변환함. 
int tolower(int c); // 문자열의 모든 영문자를 소문자로 변환함.   



다음 예제는 문자열 내의 모든 영문자를 대문자로 변환하는 예제입니다.

int i, str_len; 

char str[] = "Hello C World!";   

printf("원래 문자열 : %s\n", str); 

  

str_len = strlen(str); 

for (i = 0; i < str_len; i++) 

{ 

    str[i] = toupper(str[i]); 

} 

printf("바뀐 문자열 : %s\n", str); 


실행 결과 
원래 문자열 : Hello C World! 

바뀐 문자열 : HELLO C WORLD! 

 

 

 

 

 

'study > C언어' 카테고리의 다른 글

WIN API [GetVolumeInformation() 함수]  (0) 2020.04.08
구조체 정리  (0) 2020.04.02
인수 전달 방법  (0) 2020.03.31
배열(Array) 과 포인터(Pointer)  (0) 2020.03.31
함수(Function) 란?  (0) 2020.03.31