티스토리 뷰

728x90
SMALL

문자와 문자열 관련 함수

프로그램상에서 모니터와 키보드를 대상으로 데이터를 입출력 하기 위해서는 이들을 연결시켜주느 다리가 필요

다리의 역할을 하는 매개체 : 스트림(한 방향으로 흐르는 데이터의 흐름)

 

콘솔 입출력을 위한 '입력 스트림'과 '출력 스트림'은 프로그램이 실행되면 자동으로 생성되고, 프로그램이 종료되면 자동으로 소멸되는 스트림이다.

stdin    표준 입력 스트림    키보드 대상으로 입력

stdout  표준 출력 스트림    모니터 대상으로 출력

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

 

문자 출력 함수 : putchar, fputc

int putchar(int c);

int fputc(int c, FILE * stream);

   => 함수호출 성공 시 쓰여진 문자정보가, 실패 시 EOF 반환

 

문자 입력 함수 : getchar, fgetc

int getchar(void);

int fgetc(FILE * stream);

   => 파일의 끝에 도달하거나 함수호출 실패 시 EOF 반환

(getchar()로 널문자 삭제하기도 해)


문자열 출력 함수 : puts, fputs

int puts(const char * s); //개행

int fputs(const char * s, FILE * stream);

   => 성공 시 음수가 아닌 값을, 실패 시 EOF 반환

 

문자열 입력 함수 : gets, fgets

char * gets(char * s);

char * fgets(char * s, int n, FILE * stream);

   => 파일의 끝에 도달하거나 함수호출 실패 시 EOF 반환

( gets를 쓰면 배열 넘어서는 길이의 문자열이면 오류, fgets쓰는걸 추천, 널문자 있어서 한글자 빠져

  fgets는 \n을 만날때까지 문자열 읽어 드려서 엔터도 문자열의 일부러 저장된다.

  fgets(str, sizeof(str), stdin);
  str[strlen(str)-1]=0

)

 

표준 입출력 함수 : 지금까지 공부해 온 입출력 함수들

표준 입출력 함수를 통해서 데이터를 입출력하면 해당 데이터들은 운여체제가 제공하는

메모리 버퍼를 중간에 통과한다.

버퍼링을 하는 이유 : 키보드가 눌릴때마다 이동시키는 것 보다 묶어서 이동시키는게 효율 좋아

 

출력버퍼를 비우는 fflush 함수

int fflush(FILE * stream);

   => 함수호출 성공 시 O, 실패시 EOF 반환

 

입력버퍼는 어떻게 비워?

#include <stdio.h>

void ClearLineFromReadBuffer(void)
{
	while (getchar() != '\n');
}

int main(void)
{
	char perID[7];
	char name[10];

	fputs("주민번호 앞 6자리 입력: ", stdout);
	fgets(perID, sizeof(perID), stdin);
	ClearLineFromReadBuffer();     // 입력버퍼 비우기

	fputs("이름 입력: ", stdout);
	fgets(name, sizeof(name), stdin);

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

 

문자열의 길이를 반환하는 함수:strlen

#include <string.h>

size_t strlen(const char * s);  //개행??되는듯

   => 전달된 문자열의 길이를 반환하되, 널 문자는 길이에 포함하지 않는다.

size_t는 typeof unsigned int size_t; 로 선언

 

fgets 함수호출을 통해서 문자열을 입력받고 싶은데, 같이 딸려서 들어오는 \n 문자는 문자열에서 제외시키고 싶어

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

void RemoveBSN(char str[])
{
	int len = strlen(str);
	str[len - 1] = 0;
}

int main(void)
{
	char str[100];
	printf("문자열 입력: ");
	fgets(str, sizeof(str), stdin);
	printf("길이: %d, 내용: %s \n", strlen(str), str);

	RemoveBSN(str);
	printf("길이: %d, 내용: %s \n", strlen(str), str);
	return 0;
}

문자열을 복사하는 함수들 : strcpy, strncpy

#include <string.h>

char * strcpy(char * dest, const char * src); //src를 dest에 복사

char * strncpy(char * dest, const char * src, size_t n);

_s 붙이게 바뀜

char * strcpy_s(char * dest, rsize_t dest_size, const char * src)  //rsize_t dest_size : dest크기

char * strncpy_s(char * dest, size_t size, const char * src, size_t n);  //size_t size : 버퍼크기(dest보다 1커야돼)

   => 복사된 문자열의 주소 값 반환

int main(void)
{
    char str1[30]="Simple String";
    char str2[30];
    strncpy(str2,str1,sizeof(str2));
}

=> str1에 저장된 문자열을 str2에 복사하되, str1의 길이가 매우 길다면, sizeof(str2)가 반환한 값에 해당하는 문자의 수 만큼만 복사를 진행해라

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

int main(void)
{
	char str1[20] = "1234567890";
	char str2[20];
	char str3[5];

	/**** case 1 ****/
	strcpy_s(str2, sizeof(str2), str1);
	puts(str2);

	/**** case 2 ****/ 잘못된코드
	strncpy_s(str3, sizeof(str3)+1, str1, sizeof(str3));
	puts(str3);

	/**** case 3 ****/
	strncpy_s(str3, sizeof(str3), str1, sizeof(str3) - 1);
	str3[sizeof(str3) - 1] = 0;
	puts(str3);
	return 0;
}

문자열을 덧붙이는 함수들 : strcat, strncat

#include <string.h>

char * strcat(char * dest, const char * src);

char * strncat(char * dest, const char * src, size_t n); //n은 덧붙일 문자수, 널문자 포함x

_s붙이게 바뀜

strcat_s ( char * dest,size_t size, const char * source );

strncat_s ( char * dest,size_t size, const char * source,size_t n);

   => 덧붙여진 문자열의 주소 값 반환

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

int main(void)
{
	char str1[20] = "First~";
	char str2[20] = "Second";

	char str3[20] = "Simple num: ";
	char str4[20] = "1234567890";

	/**** case 1 ****/
	strcat_s(str1, sizeof(str1), str2);
	puts(str1);

	/**** case 2 ****/
	strncat_s(str3, sizeof(str3), str4, 7);
	puts(str3);
	return 0;
}

비교하는 함수들 : strcmp, strncmp

#include <string.h>

int strcmp(const char * s1, const char * s2);

int strncmp(const char * s1, const char * s2, size_t n);

   => 두 문자열의 내용이 같으면 0, 아니면 0이 아닌 값 반환

        (s1이 더 크면 0보다 큰 값, s2가 더 크면 0보다 작은 값 --아스키코드)

 

그 이외의 변한 함수들

<stdlib.h>

int atoi(const har * str); 문자열의 내용을 int형으로 변환

long atol(const char * str); 문자열의 내용을 long형으로 변환

double atof(const char * str); 문자열의 내용을 double형으로 변환

 

ex)

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

int WhereSpaceIndex(char str[]) {
	int i;
	for (i = 0; i < strlen(str); i++) {
		if (str[i] == ' ') {
			return i;
		}
	}
	return -1;
}

int CompName(char str1[], char str2[]) {
	int idx1, idx2;
	idx1 = WhereSpaceIndex(str1);
	idx2 = WhereSpaceIndex(str2);
	if (idx1 != idx2) return 1;
	return strncmp(str1, str2, idx1);
}

int CompAge(char str1[], char str2[]) {
	int idx1, idx2;
	int age1, age2;
	idx1 = WhereSpaceIndex(str1);
	idx2 = WhereSpaceIndex(str2);
	age1 = atoi(&str1[idx1 + 1]);
	age2 = atoi(&str2[idx2 + 1]);
	if (age1 == age2) return 0;
	else return 1;
}

int main(void)
{
	char str1[20], str2[20];
	printf("1. 이름, 나이를 입력해라");
	fgets(str1, sizeof(str1), stdin);
	str1[strlen(str1) - 1] = 0;
	printf("2. 이름, 나이를 입력해라");
	fgets(str2, sizeof(str2), stdin);
	str2[strlen(str2) - 1] = 0;
	if (CompName(str1, str2)==0) {
		puts("이름 동일");
	}
	else {
		puts("이름 다름");
	}
	if (CompAge(str1, str2)==0) {
		puts("나이 동일");
	}
	else {
		puts("나이 다름");
	}
	return 0;
}

 

 

728x90
LIST

' > 윤성우 열혈 C 프로그래밍' 카테고리의 다른 글

구조체와 사용자 정의 자료형2  (0) 2020.09.21
구조체와 사용자 정의 자료형1  (0) 2020.09.20
c언어 난수생성  (0) 2020.09.19
달팽이 배열  (0) 2020.09.19
포인터2  (0) 2020.09.16
댓글
공지사항