반응형

특정 문자열의 길이 정보를 반환한다.

 

함수형태: unsigned int strlen(const char * s)
용도 : s의 string 의 길이를 반환함.


ex) strlen(str) 아래 의 경우, NULL 문자를 제외한 7을 반환함.

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

// NULL을 제외한 수를 출력
void RemoveBSN(char str[])
{
	int len = strlen(str);								//	len에는 'Enter키'포함, NULL문자 빼고, 7이 저장됨. [123456'\n']
	str[len - 1] = 0;									//	str[7-1] = str[6] 자리에 0을 대입. 즉, 'Enter키' 자리에 0을 대입하여 
}														//	문자열을 6에서 끝냄.

int main()
{
	char str[100];
	printf("문자열 입력: ");
	fgets(str, sizeof(str), stdin);						//	키보드로 부터 입력 받음 ,123456 를 입력하면
	printf("길이: %d, 내용: %s \n", strlen(str), str);

	RemoveBSN(str);										//	위에 함수 작동.

	printf("길이: %d, 내용: %s \n", strlen(str), str);	//	함수 작동 전과 후 비교해보기.
	return 0;
}
반응형

(결과)

결과를 보면 NULL을 포함하여 입력한 갯수가 나오지만, 위 함수를 이용하면 NULL은 제외한 갯수를 보여준다.

 

 

반응형
반응형

https://www.quora.com/When-is-the-circular-buffer-in-C-empty

입력한 버퍼를 비우는 방법에 대해서는 아래 설명했다.

https://ansan-survivor.tistory.com/1322

 

[C언어] 문자열 입력 버퍼(buffer) 비우기 함수

아래 코드는 fgets함수로 키보드로 부터 입력이 들어올 때, 모든 버퍼를 싹 비워버리는 함수다. #include void ClearLineFromReadBuffer(void); int main() { // ex) 880808'\0' 총 7개 배열 필요. char perID[7];..

ansan-survivor.tistory.com

 

출력버퍼를 비워주는 내장된 함수가 있는데 이름은 fflush( ) 이다.

반응형


※ fflush 함수는 Write에서만 가능(쓰기 모드).  즉, 출력버퍼를 비울때 사용가능하다.
    int fflush(FILE * stream);

 

    각 입출력에서 "버퍼를 비운다"의 실제 의미
* 출력버퍼를 비운다:  출력버퍼를 비운다는 말은 현재까지 저장된 모든 데이터를 '목적지(모니터, 파일)로 전송한다'
* 입력버퍼를 비운다:  입력버퍼 데이터를 소멸시킴(입력된 것을 삭제), 그러나 fflush() 함수에서는 호출할 수 없다!  -> ( getchar() 로 읽고 활용하지 않고 소멸 )

 

OS의 종류에 따라 어떤 OS는 프로그램이 전부 끝난 후에 출력이 이루어 질 수 있고, 어떤 OS는 버퍼가 비워질때 출력이 이루어지는 경우가 있다.

그래서 특정경우 출력이 반드시 필요할 때는 해당 버퍼를 비워주어야 어떤 OS든간에 출력이 가능하다.

#include <stdio.h>

// fflush는 출력버퍼를 비우는 함수 !

int main()
{
	FILE * fp = fopen("data.txt", "wt");

	fflush(fp);			//	이렇게 fclose() 함수를 호출하지 않고, 중간에 fflush()함수를 이용해서 버퍼를 비울수도 있다.

	// 하지만, 버퍼를 비운다 해도 fopen이 열리면 반드시 fclose를 하는 습관을 갖자.
	fclose(fp);

	return 0;
}

 

* 주의 visual studio에서는 입력버퍼 비울때 fflush 함수를 허용하나, 이것은 표준이 아니므로 가급적이면 사용하지 않는 것이 좋다. (해당코드가 다른 OS에서 안돌 수 있다) 즉, fflush(stdin) 이런건 사용하지 않기.

 

 

 

반응형
반응형

 

아래 코드는 fgets함수로 키보드로 부터 입력이 들어올 때, 모든 버퍼를 싹 비워버리는 함수다.

#include <stdio.h>

void ClearLineFromReadBuffer(void);

int main()
{
	//	ex) 880808'\0' 총 7개 배열 필요.
	char perID[7];							
	char name[10];

	fputs("주민번호 앞 6자리: ", stdout);  //  모니터에 출력
	fgets(perID, sizeof(perID), stdin);   //  최대 크기 7 byte를 키보드로 부터 입력 받음.

	/************/
	ClearLineFromReadBuffer();            //  입력 버퍼를 비우기. 그냥 읽어들임. 반환없이.
	/************/

	fputs("이름 입력: ", stdout);          //  모니터에 출력
	fgets(name, sizeof(name), stdin);      //  최대 크기 10 byte를 키보드로 부터 입력 받음.

	printf("주민번호: %s \n", perID);
	printf("이름: %s \n", name);

	return 0;
}

void ClearLineFromReadBuffer(void)
{
	while (getchar() != '\n');        //  문자열의 끝 '엔터키'가 들어올때까지 계속 Read가 되어짐. 즉, 버퍼의 값을 사용하지 않고 그냥 버려짐.
}
반응형

(실행)

 

* 출력 버퍼를 비우는 함수 fflush 는 아래 참고.

https://ansan-survivor.tistory.com/1324

 

[C언어] 문자열 출력 버퍼(buffer) 비우는 함수 fflush() 함수

입력한 버퍼를 비우는 방법에 대해서는 아래 설명했다. https://ansan-survivor.tistory.com/1322 [C언어] 문자열 입력 버퍼(buffer) 비우기 함수 아래 코드는 fgets함수로 키보드로 부터 입력이 들어올 때, 모든

ansan-survivor.tistory.com

 

반응형
반응형

앞서 표준 입출력에 대해 설명했고, 문자(character) 1개의 1byte를 취급하는 입출력 함수에 대해 설명했다.

https://ansan-survivor.tistory.com/1297

 

[C언어] C언어 표준 입출력 stdin, stdout (입력과 출력), 문자 입출력 ( getchar, putchar, fgetc, fputc)

C언어에서 표준으로 지정된 입력스트림, 출력스트림이 있다. 보통 "키보드"의 입력을 통해 받으니 입력스트림이다. (stdin) 보통 "모니터"로 결과를 확인하니 출력스트림이다. (stdout) 그 외 default로

ansan-survivor.tistory.com

 

거의 내용이 비슷하지만 여기서는 문자열 (String) 에 대한 함수를 다룬다.

 

 

 

문자열 출력 함수로 : puts, fputs 가 있다.

 

출력 함수 puts

 - 함수 원형: int puts(const char * string)

 - 반환형이 int인 이유? char형은 컴파일러마다 unsigned, signed가 다른데, int는 모든 컴파일러가 signed int로 처리함.

 - int형 이므로 어떤 컴파일러든 -1값(EOF)을 반환하는데 무리가 없다.

 - 자동으로 문자열 맨뒤 '\n' 개행이 붙는다.

 - char * 이므로 메모리상의 특정 문자열의 주소값이 그데로 전달 됨을 알 수 있다. (문자열 전달 방식 아래 참고)

https://ansan-survivor.tistory.com/1251

 

[C언어] 포인터로 문자열 선언, 배열 문자열 선언과 차이. (문자열 내부 변경하기)

문자열(string)이란, 알파벳 하나하나가 메모리상의 연속적으로 나열되며, 마지막에는 '\0' (NULL)으로 끝나는 배열이다. 위 그림과 같이 문자열을 만드는 방법은 아래와 같다. char string[11] = "hello worl

ansan-survivor.tistory.com

 

출력 함수 fputs

 - 함수 원형: int puts(const char * string, FILE * stdout)

 - 반환형이 int인 이유? char형은 컴파일러마다 unsigned, signed가 다른데, int는 모든 컴파일러가 signed int로 처리함.

 - int형 이므로 어떤 컴파일러든 -1값(EOF)을 반환하는데 무리가 없다.

 - 문자열 맨뒤 '\n' 개행이 붙지 않는다. (직접 붙어야 함)

 - puts와 마찬가지로 문자열의 주소값이 전달되나, 2번째 인자로 출력 형태를 정한다. stdout은 모니터 출력, 파일출력으로 변경 가능.

 

#include<stdio.h>

int main(void)
{
    char* str = "hello world";

    printf("1. puts test \n");
    puts(str);

    printf("2. fputs test \n");
    fputs(str, stdout);         // stdout : 모니터출력, 뒤에 개행이 없음

    return 0;
}

 

반응형

 

 

문자열 입력 함수로 : gets, fgets 가 있다.

 - 함수 원형: char gets(const char * string)

 - 함수 원형: char fgets(const char * string, int n ,FILE * stdin)

 

gets 사용 방법.

 - 할당 받은 배열 이상 초과하지 않도록 주의

 - 문자열의 끝인 NULL이 없는경우 메모리 침범문제 발생

int main(void)
{
	char str[7];	//	7개의 배열 공간 할당
	gets(str);	//	마지막 NULL을 포함한 6개의 문자열 가능. 그 이상 들어오면 할당되지 않은 메모리 침범 에러
}

 

 

fgets 사용 방법.

 - gets의 단점을 보완.

int main(void)
{
	char str[7];	//	7개의 배열 공간 할당
    // 배열의 주소, 배열의 크기, stdin-키보드입력
	fgets(str, sizeof(str), stdin);	
    
}

 

예제)

입력받은 문자열을 6자씩 잘라서 표현

#include<stdio.h>

int main(void)
{
    char str[7];
    int i;

    for (i = 0; i < 5; i++)
    {
        fgets(str, sizeof(str), stdin);
        printf("%d: %s\n", i+1, str);
    }

    return 0;
}

아래와 같이 입력하면 총 6개의 글이 들어간다. (맨뒤는 NULL문자가 있기에 배열길이가 7이다)

 

 

반응형
반응형

파일의 개방 모드 
 -> stream을 어떻게 생성하는가에 대한 방법. fopen(  , "wt" 또는 "rt" ) write와 read 이 외 모드.

 


a.txt data는 사람이 볼수 있는 파일,  

a.bin 메모장으로 읽을 수 없는 이진수로 된 파일. (음원, 영상 등 소프트웨어에 의해 해석이 되는 데이터)

 

"wt" : write text        -> 텍스트 형태로 사람 또는 프로그램이 쓸 수 있음
"wb" : write binary    -> 바이너리(bin) 파일로 프로그램이 기계어로 생성 (그림, 시스템파일, 데이터베이스 등)


"rt" : read text         -> 위와 동일, 다만 '읽기 모드'
"rb" : read binary

 


스트림의 구분 기준.

1. 읽기 위한 스트림인가? 쓰기 위한 스트림인가?
2. Text 데이터를 위한 스트림인가?  Binary를 위한 데이터 스트림인가?

모드(mode) 스트림의 성격 파일 없으면
r 읽기가능                에러
w 쓰기가능                생성
a 파일끝 덧붙여 쓰기가능 생성
r+ 읽기/쓰기 가능 에러
w+ 읽기/쓰기 가능 생성
a+ 읽기/덧붙여 쓰기 가능 생성
반응형


그러나 +모드들은 잘 사용하지 않음.
모드 r w a 를 주로 사용함.
특징: r은 없으면 에러발생, a는 파일없으면 생성.
       w는 덮어쓰지만, a는 그 뒤에 덮어씀.

// 사용 예제. 이와 같이 모드를 사용함.
fopen("file.txt", "rb");	// read binary
fopen("file.txt", "wt");	//	write text
fopen("file.txt", "a+t");	//	a+ text

 

파일 생성해 쓰기 (파일이 있을 시 덮어씌움)

#define _CRT_SECURE_NO_WARNINGS 는 비주얼스튜디오를 사용할 때 필요하다.

#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지
#include<stdio.h>

int main(void)
{
    FILE* pFile = fopen("test.txt", "w");

    fprintf(pFile, "hello world");        
    fclose(pFile);

    return 0;
}

(결과)

저장 경로를 따로 지정하지 않아서 .c 파일이 있는 위치에 아래와 같이 txt파일이 생성되었다.

 

 

존재하는 파일을 읽기

#define _CRT_SECURE_NO_WARNINGS 는 비주얼스튜디오를 사용할 때 필요하다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
    FILE* pFile = fopen("test.txt", "r"); //read mode 
    if(pFile == NULL)
    {
        //r로 읽을 때는 파일이 없을 수 있기 때문에 이렇게 널체크를 해주어야합니다.
        //파일이 없으면 FILE*가 NULL 입니다.
        //파일이 없을때 파일을 만드는 처리를 하던지 프로그램에 맞게 짜면됩니다.
        //여기서는 프로그램을 종료 하겠습니다.
        printf("파일이 없습니다. 프로그램을 종료합니다.");
        return 0;
    }
    
    //여기까지 와다는건 read 모드로 파일이 열린것 입니다.
    char str[50];
    fgets(str, 50, pFile);  //파일에 있는거 읽어오기
    
    fclose(pFile);          //파일 닫기
    printf("%s\n", str);    //터미널에 출력
    return 0;
}

(결과)

위에서 생성한 test.txt 파일 내부 글자를 읽고 터미널에 출력했다.

 

 

존재하는 파일에 덮어쓰지 않고, 뒤에 추가하기

#define _CRT_SECURE_NO_WARNINGS 는 비주얼스튜디오를 사용할 때 필요하다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main(void)
{
    // 추가쓰기 모드로 열기
    FILE* pFile = fopen("test.txt", "a");    

    fputs("\n 한줄 내려와서 글자 추가!", pFile); 
    fclose(pFile);                              

    return 0;
}

(결과)

이미 생성된 text.txt 파일에 한줄 내려와서 새로운 글자를 추가하고 닫았다.

 

반응형
반응형

EOF란?  End of File의 약어로, "파일의 끝을 표현한 상수로 -1 값을 지칭

즉, 파일을 대상으로 fgetc (읽기함수)가 호출되었을 때 그 파일의 끝에 도달하면 EOF (= -1)이 반환되어 끝을 알린다.

 

만약 fgetc(stdin) 으로 키보드를 입력장치로 콘솔, 터미널에서 입력을 받을 때,

Windows에서는 "Ctrl+Z"키

Linux에서는 "Ctrl+D"키

를 입력받을 때 EOF를 반환한다.

반응형

예시)

아래 코드는 키보드를 입력하면 똑같이 echo하는 코드이다. 그러나 만약 유저가 Ctrl+Z키를 누르면 콘솔이 종료된다.

만약 리눅스에서 실행한다면, Ctrl+D를 눌러야 종료된다.

#include <stdio.h>

int main()
{
	int ch;

	while (1)
	{
		// 키보드로부터 입력받음
		ch = getchar();
		if (ch == EOF)
		{
			break;
		}
		putchar(ch);
	}

	return 0;
}

(결과)

입력한 결과가 그대로 echo된다. 그리고 Ctrl+Z를 누르면 콘솔에서 (^Z)로 표시되며 종료된다.

 

 

 

반응형
반응형

C언어에서 표준으로 지정된 입력스트림, 출력스트림이 있다.

 

보통 "키보드"의 입력을 통해 받으니 입력스트림이다. (stdin)

보통 "모니터"로 결과를 확인하니 출력스트림이다. (stdout)

그 외 default로 "모니터"출력으로 설정된 에러스트림이 있다. (stderr) -> (필요에 따라 출력을 파일로 스트림을 변경가능)

반응형

 

문자(character)를 1개만 입력받는 함수 getchar

 - 함수 원형: int getchar(void)

 - 반환형이 int인 이유? char형은 컴파일러마다 unsigned, signed가 다른데, int는 모든 컴파일러가 signed int로 처리함.

 - int형 이므로 어떤 컴파일러든 -1값을 반환하는데 무리가 없다.

 

문자(character)를 1개만 출력하는 함수 putchar

#include <stdio.h>

int main()
{
	int ch1;

	// 문자(character) 1개만 입력받아 저장
	ch1 = getchar();

	// 1개의 문자만을 출력
	putchar(ch1);

	return 0;
}

(결과)

어떤 문자들을 넣어도, 제일 처음에 입력된 문자만 ch1에 저장되며, 해당 문자 1개만 출력된다.

 

 

#include <stdio.h>

int main()
{
	int ch2;

	// fgetc는 뒤에 인자로 stdin을 택하면 키보드, 그 외 다른 파일을 읽는 것과 같은 입력 인자를 넣을 수 있다.
	ch2 = fgetc(stdin);

	// fputc는 뒤에 인자로 stdout을 택하면 모니터, 그 외 파일으로 출력인자를 선택할 수 있다.
	fputc(ch2, stdout);

	return 0;
}

(결과) 위와 마찬가지다.

 

getchar, putchar는 특정 설정없이 자동으로 표준입출력 stdout, stdin이 설정되어있음을 알 수 있고,

fgetc, fputc는 stdin, stdout으로 입출력을 프로그래머가 작성하고, 또한 파일같은 다른 형태로 변경이 가능하다.

단, 공통적으로 하나의 문자(character)를 입력받고 또는 출력한다.

 

 

반응형
반응형

c언어에서 기본적으로 프로그램을 실행할 때 항상 보는 함수가 있다.

main( )함수이다.

 

이 main함수에 윈도우나 리눅스 같은 OS의 명령프롬프트를 이용해 인자를 전달해서 특정 동작을해서 작동하도록 할 수 있다.

main함수는 프로그램 동작시 자동으로 실행되는 함수로, .exe 실행파일을 만들어놓고, OS프롬프트로 해당 .exe파일을 실행하면 된다.

 

예시)

#include <stdio.h>


// 첫번째 인자 argc는 전달된 인자의 갯수 (int형).
// 두번째는 char** 형태로 문자열 전달. (더블포인터 형 char** argv = char* argv[] 같은 말.)
int main(int argc, char* argv[])
{
	int i = 0;
	printf("전달된 인자 갯수: %d\n", argc);

	for (i=0; i<argc ;i++)
	{
		printf("%d번째 문자열: %s\n", i+1, argv[i]);
	}

	return 0;
}
반응형

(결과)

윈도우 프롬프트에 해당 프로그램의 .exe파일로 가서 실행하며 동시에 인자를 넣어준다.

드라이브가 C가 아닌 경우 아래 참고. (다른 드라이브로 이동)

https://ansan-survivor.tistory.com/83

 

윈도우 명령프롬프트 cmd에서 다른드라이브 이동 ( D드라이브 , E드라이브, F드라이브 가는 방법 )

cd 없이 >D: 입력하면 된다. 마찬가지로 나머지 드라이브도 E: F: 등등 입력하면 이동한다.

ansan-survivor.tistory.com

 

결과를 보면, 첫번째 argc 에는 입력된 인자의 갯수를 int형태로 전당하고,

argv[ ] 는 전달된 문자열(string)을 띄어쓰기를 구분자(delimeter)으로 전달함을 볼 수 있다.

각 문자열의 끝은 NULL문자로 구분하기 때문에 자동으로 NULL(\0)이 들어간다.

그러나 배열의 마지막 1개가 더 생성되서 NULL (\0)을 넣고 해당 문자열이 끝남을 알린다.

 

또한 전달 인자를 " " 큰따옴표로 묶으면 하나의 문자열로 간주하여 전달한다.

 

반응형
12345···9

+ Recent posts