본문 바로가기

Algorithm/C프로그래밍

[5주차] 문자열

반응형

문자열의 저장 방식

 

#10.4 문자열의 배열

🏃‍♂️ 다수의 문자열을 처리하는 방법을 학습한다.

 

다수의 문자열 처리하기(1): 문자 배열을 여러 개 사용

  • 2차원 문자 배열 이용
int i;
char num[3][5] = {"zero", "one", "two"};

for( i=0; i<3; ++i )
	printf("%s\n", num[i]);

여기서 num[0],num[1],num[2]의 자료형은 char *이다.

다수의 문자열 처리하기(2): 문자형 포인터를 여러 개 사용

char *pnum0 = "zero";
char *pnum1 = "one";
char *pnum2 = "two";

printf("%s\n",pnum);
printf("%s\n",pnum1);
printf("%s\n",pnum2);

다수의 문자열 처리하기(3): 문자 포인터 배열(포인터를 배열로 묶기)

위의 pnum0, pnum1, pnum2를 묶으면 포인터 배열이 됨.

int i;
char *pnum[3] = {"zero", "one", "two"};

for( i=0; i<3; ++i )
	prinf("%s\n", pnum[i]);

 


 

#10.5 문자열 및 문자 처리 함수(1)

🏃‍♂️ 문자열 및 문자 처리 표준 함수의 사용법을 익힌다. 

 

문자열 처리 표준 함수

  • C언어에서는 문자열 처리에 관련된 다양한 표준 함수 제공
  • 대부분 <string.h> 헤더 파일에 함수의 원형 선언되어 있음
    • 이 헤더파일을 include 시켜야 함 -> #include <string.h>
  • 대부분 문자열 처리 함수의 코드를 작성하는 것은 어렵지 않지만, 이미 구현되어 있는 표준 함수를 사용하는 것이 편리

 

문자열의 길이 구하기 1(직접 구현)

널 문자와 반복문을 이용하여 구할 수 있음.

char str[20] = "Hello World";
int i = 0; 

while (str[i]) 
	++i;
printf("length: %d\n",i);

문자열의 길이 구하기 2(표준 함수 strlen 이용)

  • 원형: unsigned int strlen(char *s)
  • 기능: 문자열 s의 길이 반환
int main() {
	char str[20] = "Hello World";
    printf("%length: %d\n", strlen(str))
    return 0;
}

 

문자열 복사하기

  • 원형: cahr *strcpy(char *dest, char *src)
  • 기능: dest의 공간에 src의 문자열 복사(문자열 대입). src는 변화 없음
char str[6] = "Hello";
strcpy(str1, "hi");

printf("str1: %s!!\n",str1);
  • 참고: strncpy() 함수: 복사할 문자열의 길이를 지정하는 함수

 

strcpy(dest,src) 사용 시 주의사항

  • dest(목적지)의 공간이 src의 문자열 길이+1(널 문자) 이상이어야 함. 그렇지 않으면 런타임 오류.

 

문자열 접합하기

  • char *strcat(char *dest, char *src)
  • 기능: 문자열 뒤에 src의 문자열 접합. src는 변화 없음.
  • 참고: strncat() 함수: 접합할 문자열의 길이를 지정하는 함수

 


#10.5 문자열 및 문자 처리 함수(2)

문자열 비교하기

  • 원형: int strcmp(char *lhs, char *rhs)
  • 기능: 사전 순으로 lhs와 rhs를 비교하여 음수/0/양수 반환
    • 문자열 lhs<rhs -> 음수
    • 문자열 lhs==rhs -> 0
    • 문자열 lhs>rhs -> 양수
  • 문자는 단순히 아스키 코드 값 비교함.
  • 널 문자 '\n'가 가장 작음
  • 문자가 같을 경우 다음 문자로 이동해서 비교
  • 참고: strncmp() 함수: 비교할 문자열의 길이를 지정하는 함수
char s1[50] = "hi", s2[50] = "hello";
int cmp_result = strcmp(s1,s2);

if(cmp_result<0)
	printf("%s가 %s보다 앞에 있습니다.\n",s1,s2);
else if(cmp_result == 0)
	printf("%s가 %s와 같습니다. \n",s1,s2);
else 
	printf("%s가 %s보다 뒤에 있습니다.\n",s1,s2);

 

예제 10.6

사용자로부터 두 개의 문자열 A와 B를 입력 받아 다음 과정을 수행하는 프로그램을 작성하시오.

  • 문자열 A와 B의 길이를 각각 출력
  • A와 B 중 사전 순으로 빠른 문자열 출력
  • ABA 형태의 새로운 문자열 C를 생성하고 출력
  • A와 B의 길이는 20 이내이고 공백, 탭, 개행 문자는 없다고 가정
  • 두 문자열은 서로 다르다고 가정
#include <stdio.h>
#include <string.h>

int main() {
	char A[21], B[21], C[61], ch;
    
    scanf("%s', A);
    scanf("%c", &ch);	// 엔터도 문자로 처리되므로 엔터 입력받아 버려줄 것 필요함
    scanf("%s", B);
    
    printf("%d %d\n", strlen(A), strlen(B));
    
    if (strcmp(A,B) < 0)
    	printf("%s\n",A);
    else
    	printf("%s\n", B);
        
    strcpy(C, A);
    strcat(C, B);
    strcat(C, A);
    
    printf("%s\n, C);
        
    return 0;
    
}

 

10진수로 표현된 문자열을 수로 변환

  • int atoi(char *str): 문자열을 입력받아 int형으로 계산하여 반환
  • long atol(char *str): 문자열을 입력받아 long형으로 계산하여 반환
  • double atof(char *str): 문자열을 입력받아 double형으로 계산하여 반환
  • <stdlib.h>에 원형 선언되어 있음.(standard library)

 

출처: 세종대학교 고C 강의자료

 

 

#10.6 문자열 및 문자 입출력

🏃‍♂️ 문자열 및 문자 입출력 표준 함수의 사용법을 익힌다.

 

입출력 함수

  • printf와 scanf: 다양한 기능을 가진 범용 입출력 함수
    • 함수의 크기 크고, 속도 느림
  • C언어에서는 문자열과 문자에 특화된 입출력 함수 제공
    • 속도 빠르고, 문자 또는 문자열 입출력에 적합
    • 문자열 입출력 함수: puts, gets(gets_s, fputs)
    • 문자 입출력 함수: putchar, getchar
  • 위 함수들은 모두 <stdio.h>에 선언되어 있음

 

문자열 출력 함수: int puts(char *str)

  • str이 가리키는 문자열을 화면에 출력하고, 마지막에 '\n' 출력
  • 반환 값: 출력에 성공하면 음수가 아닌 값, 실패하면 EOF
    • 참고: EOF(End Of File): 파일의 끝을 나타내는 상수. -1.
char str[10] = "Hi World";
int ret = 1;

ret = puts(str);
printf("return: %d\n", ret); // puts 함수의 return 값 받아와서 출력

 

문자열 입력 함수: char *gets(char *s)

  • 사용자로부터 문자열을 입력 받아, s가 가리키는 메모리 영역에 저장하고, 포인터 s를 리턴
    • 엔터('\n')가 입력될 때까지 입력된 모든 문자들을 저장(scanf의 경우 공백, 탭, 개행이 입력될 때까지 저장)
    • 마지막에 입력된 '\n'은 무시하고, 맨 뒤에 '\0'를 붙임
    • 문자열을 저장할 충분한 메모리 공간이 확보되어 있어야 함
    • 참고: gets_s()함수: gets() 함수의 보안 보전으로, 문자열을 저장할 배열 크기를 인자로 전달

참고) 보안 상의 문제로 gets() 함수는 표준에서 제외되고, gets_s() 함수가 표준에 추가됨

  • VS의 경우 2015 버전부터 gets() 함수 지원 안 함 -> gets_s() 사용
  • gcc의 경우, 아직 gets()를 지원하고, gets_s()를 지원하지 않음
    • gcc 사용하는 온라인 채점 시스템(OJ)는 gets() 사용해야 함
  • 또는 대안으로 fgets 함수 사용 
    • 개행 문자도 문자열에 저장. 파일 처리할 때 사용됨.
    • char str[10];
      fgets(str, 10, stdin);
      printf("str: %s!!", str);
       

 

문자 입출력 함수: 

  • int putchar(int c): 인자 c의 문자를 화면에 출력
  • int getchar(void): 사용자로부터 입력된 문자 반환
  • 성공하면 입출력된 문자 반환, 실패하면 EOF 반환
int c;

c=getchar();	//H 입력
purtchar(c);	//H 출력
반응형

'Algorithm > C프로그래밍' 카테고리의 다른 글

[10주차] 동적 할당  (4) 2021.11.05
[9주차] 동적 할당  (0) 2021.11.05
[4주차] 문자열  (0) 2021.09.27
[2주차] 포인터(3), (4)  (4) 2021.09.13
[1주차] 2. 포인터(2)  (0) 2021.09.13