반응형

    21장. 문자와 문자열 관련 함수

    1. 스트림과 데이터의 이동

     

    - 입력 : 프로그램 안으로 데이터가 들어오는 것

    - 출력 : 프로그램 밖으로 데이터가 흘러나가는 것 

     

    - 스트림 : 모니터와 키보드 사이의 가상의 다리 역활 ( 자동으로 생성 및 종료 )

    - stdin : 표준 입력 스트림 (키보드 대상으로 입력)

    - stdout : 표준 출력 스트림 (모니터 대상으로 출력)

    - stderr : 표준 에러 스트림 (모니터 대상으로 출력)



    2. 문자 단위 입,출력 함수

     

    - printf, scanf 도 있지만, 서식지정을 통하여 입출력의 형태를 구성하므로, 메모리 공간도 크고, 해야 할 연산의 양이 많아 상대적으로 

    속도가 느리다. 또한 문장을 구성하는것도 번거롭다. 

     

    - 문자 출력 : putchar, fputc 

    - 문자 입력 : getchar, fgetc (입력버퍼에 \n 문자도 함께 저장)

     

    - EOF(End Of File) : 파일의 끝을 표현, -1로 정의된 상수

    getchar, fgetc : 함수 호출의 실패, CTRL+Z, CTRL+D 키 입력시 EOF 반환 

    # include <stdio.h>
    
    int main(void)
    {
    	int ch1, ch2;
    	ch1 = getchar(); // stdin에서 문자를 입력받음, getchar()에서 입력버퍼로 a+\n 값 저장 후 
                         // ch1 으로 단어 하나 a를 반환.
    	ch2 = fgetc(stdin); // 입력버퍼에 아직 \n 값 남아있음, 자동으로 ch2에 \n값이 저장
       
    	putchar(ch1); // ch1을 stdout 으로 출력, a
    	fputc(ch2, stdout); // ch2을 지정스트림(stdout) 으로 출력, \n file 도 가능 
    	return 0;
    }

     

    3. 문자열 단위 입,출력 함수

     

    - 문자 출력 : puts, fputs

    - 문자 입력 : gets, fgets 

    ex) gets(str) //입력받은 문자열을 str 에 저장 

     

    fgets의 특징 : 자동으로 문자열의 끝에 널 문자 추가

                          \n을 만날때까지 문자열을 읽어 들이는데, \n 도 함께 저장

                          엔터입력시 입력버퍼로 데이터가 들어감 

    #include <stdio.h>
    
    int main(void)
    {
    	char* str = "Simple String";
    
    	printf("1. puts test-----\n");
    	puts(str);
    	puts("So Simple String");
    
    	printf("2. fputs test----\n");
    	fputs(str, stdout);
    	fputs("So Simple String",stdout);
    	printf("3. finall---\n");
    }
    
    // 결과 출력 , 즉 fputs는 자동으로 개행이 이루어지지 않는다.
    1. puts test-----
    Simple String
    So Simple String
    2. fputs test----
    Simple StringSo Simple String3. finall----
    
    int main(void)
    {
    	char str[7];
    	int i;
    
    	for (i = 0; i < 3; i++) {
    
    		//gets(str); //입력받은 문자열을 배열 str 에 저장, 배열의 크기 이상이면 오류 발생, 즉 fgets 이용
    		fgets(str, sizeof(str), stdin); //stdin으로 문자열을 입력받아 배열 str에 저장하되, str의 크기만큼 저장,
                                            //즉, 10개의 문자를 입력시 4개의 문자는 입력버퍼에 남아있다. 
    		printf("Read %d: %s \n", i + 1, str);
    	}
    	return 0;
    
    }
    
    // 결과 출력
    123456789012345
    Read 1: 123456
    Read 2: 789012
    Read 3: 345

     

    4. 표준 입출력과 버퍼 ( 예제 꼭 확인하고 넘어가기! )

     

    - 키보드 -> 입력 스트림 -> 입력 버퍼(메모리) -> 실행중인 프로그램

    - 출력버퍼를 비우기(데이터가 목적지로 이동) : fflush(stdout)  

    #include <stdio.h>
    
    //void clear(void) {
    //	while (getchar() != '\n');
    //}
    
    int main(void)
    {
    	char perID[7];
    	char name[10];
    
    	fputs("주민번호 앞 6자리 입력 : ", stdout);
    	fgets(perID, sizeof(perID), stdin);
        // clear() ; // 입력 버퍼 비우기 
    
    	fputs("이릅 입력 : ", stdout);
    	fgets(name, sizeof(name), stdin);
    
    	printf("주민번호:%s \n", perID);
    	printf("이름:%s \n", name);
    
    	return 0;
    
    }
    // 결과 출력 
    주민번호 앞 6자리 입력 : 931220-2844444
    이릅 입력 : 주민번호:931220 // 입력버퍼에 \n의 값이 존재하여, 입력할 기회를 주지않고 바로 값 저장후 넘어감
    이름:-2844444
    

    - 입력버퍼 비우기 : clear 코드 추가 

    입력버퍼에  저장된 문자들을 읽어들이면 지워진다.

    즉 getchar() : 문자를 하나씩 읽어옴, 읽어온 문자가 \n이면 while값이 false 로 되어 종료! 

    장점 : 프로그램 사용자가 잘못 입력을해도, 필요한 만큼만 읽어 들이고 나머지는 지워버린다.

     

     

    5. 그 외 함수

     

    - strlen : 문자열의 길이 반환 ( null 문자 - '\0' 는 길이에서 제외 시킨다. )

    ex ) strlen(str) 

    - strcpy,strncpy : 문자열 복사

    ex) strcpy( (char*)str2, (char*)str1) // str1 의 문자열을 str2 에 복사

          strncpy( (char*)str2, (char*)str1, sizeof(str2)); str1의 문자열을 str2 에 복사하되, sizeof(str2)의 크기만큼 복사를 진행! 

    int main(void)
    {
    	char str1[20] = "1234567890";
    	char str3[5];
    
    	strncpy(str3, str1, sizeof(str3)); // str3 에 12345 저장이 됩니다.
    	puts(str3); // 오류발생, puts 함수는 null 값까지 출력을 하나, null 값이 저장되지 않아, 어디까지 출력을 해야할지 
                       //puts 함수가 판단을 할 수 없습니다.
    
    	strncpy(str3, str1, sizeof(str3) - 1);  //str3에 1234 저장
    	str3[sizeof(str3) - 1]= 0; // 마지막배열에 null 값을 입력해 줍니다. 
    	puts(str3);
    	return 0; 
    
    }

     

    - strcat, strncat : 문자열 덧붙임

    ex) strcat((char*)str1, (char*)str2) // str1의 문자열 뒤에 str2 를 복사

          strncat((char*)str1, (char*)str2, 8) //str2 의 문자중 최대 8개를 str1의 뒤에 덧붙여라! 

          결과 > str1+str2(8문자) + null문자( 자동 )

     

    - strcmp, strncmp : 문자열 비교

    ex ) strcmp((const char *)s1,(const cahr * ) s2) // S1이 더크면 양수 반환 , 작으면 음수 반환, 같으면 0반환

           strncmp("S1", "S2", 3) // 3번째 문자 까지만 비교  

     

    - int atoi, long atol, double atof : 형변환 함수  

    ex) atoi(str) // 문자를 int형으로 변환, 나머지 동일 

     

    열혈 C 프로그래밍 참조

     

    반응형

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

    C언어 다차원배열과 포인터  (0) 2020.01.15
    C언어 자료형과 기본 출력 함수  (0) 2020.01.14
    C언어 포인터와 배열  (0) 2020.01.14
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기