몽상실현개발주의

[따배씨] 11.4 문자열을 입력받는 다양한 방법들 본문

Language/C

[따배씨] 11.4 문자열을 입력받는 다양한 방법들

migrationArc 2021. 6. 9. 17:33

[따배씨] 11.4 문자열을 입력받는 다양한 방법들

따배씨 - 따라하며 배우는 C언어

11강 문자열 함수들

11.4 문자열을 입력받는 다양한 방법들

  • 입력받은 메모리 공간을 확보한 다음에 입력을 받아야 함

 

#include <stdio.h>

#define STRLEN 81

int main(){
    char words[STRLEN] = "";
    gets(words);
    // Hello words
    
    printf("START\n");
    // START
    printf("%s", words);
    puts(words);
    // Hello wordsHello words
    puts("END.");
    // END.
    
    return 0;
}
char words[STRLEN] = "";
gets(words);
  • gets 함수는 String 의 첫 주소를 받아서 출력
    • 포인터 하나만 받아서는 사용할 메모리의 크기를 알 수 없음
    • 시작점만 알고 끝나는 메모리 주소를 모르는 상태
      • 포인터 하나를 argument 로 받는 함수들이 겪는 공통된 문제
gets_s(words, sizeof(words));
  • C11 표준에서, pointer 와 size 를 같이 받아 주는 함수를 지원

 

 

#include <stdio.h>

int main(){
    char words[5] = "";
    gets(words);
  	// abcdefghijklmn // 5 보다 긴 문자열 입력
    
    printf("START\n");
    printf("%s", words);
    puts(words);
    puts("END.");
    
    return 0;
}
char words[5] = "";
gets(words);
// abcdefghijklmn // 5 보다 긴 문자열 입력
  • Runtime Error 발생
char words[5] = "";
fgets(words, sizeof(words), stdin);
// abcdefghijklmn // 5 보다 긴 문자열 입력

fgets 는 읽어 들이는 데이터가 언제 끝날지 모른다는것을 염두해두기 때문에 더 긴 문자열을 입력하여도 처리 가능

  • 단, 설정한 문자열의 길이만큼만 처리
  • fgets 는 '\n' 를 제거하지 않고 그대로 읽어들임, 파일 입출력의 특징
    • stdin 을 통해서 standard 입력으로 사용하여 '\n' 을 마지막 입력으로 받아주고 입력을 종료
    • '\n' 을 '\0'(Null Character) 으로 변경하지 않으면 출력시 줄바꿈 까지 출력되는것을 주의
  • 긴 문자열을 입력시에는 마지막 Null character 공간을 고려하여 저장됨
char words[5] = "";
fgets(words, sizeof(words), stdin);
// abcdefghijklmn
// words = "abcd\0"

 

  • fgets 의 return 값
    • 정상 입력시, 입력받은 포인터
    • EOF 입력(파일의 끝)시, NULL Character

 

fputs(words, stdout);
  • fputs 는 파일 출력, stdout 을 이용하여 standard 출력으로 사용 가능

 

 

 

#include <stdio.h>

int main(){
    char small_array[5];
    
    puts("Enter long strings:");
    while (fgets(small_array, 5, stdin) != NULL & small_array[0] != '\n'){
        fputs(small_array, stdout);
    }
    
    return 0;
}
  • Buffer 를 이용하여, 작은 공간에 입력 받았지만 한번에 입력 받은 것 처럼 출력 동작

 

 

#include <stdio.h>

int main(){
    char str1[6], str2[6];
    int count  = scanf("%5s %5s", str1, str2);
  	// 123456789012345
    
    printf("%s|%s\n", str1, str2);
  	// 12345|67890
    
    return 0;
}
  • %5s, 입력 글자수를 5자로 제한하여 긴 입력을 잘라서 입력 받음

 

 

#include <stdio.h>

int main(){
    char str1[6], str2[6];
    int count  = scanf("%6s %6s", str1, str2);
  	// 123456789012345
    
    printf("%s|%s\n", str1, str2);
    // |789012
    return 0;
}
  • %6s, String 을 선언한 공간보다 큰 입력을 받으려고 하면 비정상 동작

 

 

char* custom_string_input(char* st, int n){
    char* ret_ptr;
    int i = 0;
    
    ret_ptr = fgets(st, n, stdin);
    if (ret_ptr){
        while (st[i] != '\n' && st[i] != '\0')
            i++;
        if (st[i] == '\n')
            st[i] = '\0';
        else
            while (getchar() != '\n')   // clear buffer
                continue;
    }
    
    return ret_ptr;
}
  • 문자열 입력함수를 만들어서 사용 가능
    • 그럴 일은 없다

 


이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.

http://blog.naver.com/atelierjpro

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

 

Comments