7장 문자열
§ 7장의 학습목표: 문자의 배열(char의 배열)

[문자열과 배열]
- 문자열
   문자열: 문자들이 메모리의 연속적인 위치에 배치됨
   널문자('0'로 종료됨 (널문자는 문자열 끝을 의미)
   "korea" ->k o r e a \0      ....\0 : 00000000 (8bits)

- 문자열과 배열
   문자열은 문자배열에 저장 가능
   (문자배열의 크기 >= 문자 개수+1) 이어야 함
   문자배열에 저장된 문자들이 '\0'으로 끝나지 않으면 문자열이 아님

[문자 배열 초기화]
- 문자열을 사용하지 않는 초기화
   1. char s[4];
      s[0] = 'd'; s[1]='a'; s[2]='y'; s[3]='\0';
   2. char s[4] = {'d','a','y','\0'};

- 문자열 상수로 초기화
   char s[5]="day";     .... 배열크기는 문자 개수보다 1이상 커야 함
   char s[]="day";       .... 배열크기가 문자열 저장에 필요한 크기로 됨 = 4

- strcpy() 함수를 사용한 초기화
   #include <string.h>
   char s[4];            ... strcpy()함수 원형 선언 포함
   ...
   strcpy(s, "day")    ... 프로그램 내에서 문자배열에 문자열 복사

- 잘못된 예
  s = "day";               ... 배열이라 절대 불가능하다

[문자열 입출력]
- 문자열 입출력
   입력: scanf(), gets()
   출력: printf(), puts()

- 문자열 입력
사용자 삽입 이미지
※ 배열인 경우에는 scanf("%s",a);     ... &a 로 붙이지 마라!!!!

- 문자열 출력
사용자 삽입 이미지

[문자열 처리 함수]
- 인수로 문자열을 사용하는 함수 : 문자열 끝이 널문자로 끝나므로 배열 크기 인수 불필요

- 예) 문자열 길이 계산 함수
   널문자는 문자열 길이에 포함되지 않음
   널문자의 첨자가 문자열 길이와 같음

   int strlen(const char s[])
사용자 삽입 이미지

   {
        int i = 0;
        while (s[i] != '\0')
                i++;
        return i
    }

- 예) 문자열 복사 함수
   void strcpy(char s1[], const char s2[])
   {
       int i;
       for (i=0; s2[] != '\0'; i++);
            s1[i] = s2[i];
       s1[i] = '\0';
    }
사용자 삽입 이미지

[문자열 라이브러리 함수]
- 문자열 라이브러리 함수
   표준 라이브러리 함수에서 문자열 처리 함수 제공
   헤더파일: #include <string.h>

    strcpy(s1,s2)              문자열 s2를 문자열 s1으로 복사
    strcat(s1,s2)               문자열 s2를 문자열 s1뒤에 연결하여 붙임
    strcmp(s1,s2)              문자열 s1과 s2를 사전식 비교
    strlen(s1)                   문자열 s1 길이
    strncpy(s1, s2, n)        문자열 s2를 최대 n 문자까지 문자열 s1으로 복사
    strncat(s1,s2,n)           문자열 s2를 최대 n 문자까지 문자열 s1뒤에 붙임
    strncmp(s1,s2,n)         문자열 s1과 s2를 최대 n 문자까지 사전식 비교

- 예) strcat() 함수를 사용한 문자열 연결하기
   char s1[13] = "pretty";
   char s2[7] = "girl";
사용자 삽입 이미지

연습문제
연산 이름과 연산을 할 두 정수를 입력 받아서 주어진 연산 결과를 출력하는 프로그램 작성
연산 이름: add  sub  mul  div(몫) mod(나머지) power(거듭제곱)
  입력 형식
  add    1   2  출력: 3
  power  3   4  출력: 81

== 코딩 ==
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(void)
{
 int i, j;
 char s [20];
 double res;

 printf("연산자와 두 정수를 입력하시오. ex)mod 4 3\n");
 printf("(사용 가능 연산자: add, sub, mul, div, mod, power)\n");

 scanf("%s %d %d", s, &i, &j);

사용자 삽입 이미지

 while(strcmp(s, "$") != 0){
  if(strcmp(s, "add") == 0)
   res = i + j;
  else if(strcmp(s, "sub") == 0)
   res = i - j;
  else if(strcmp(s, "mul") == 0)
   res = i * j;
  else if(strcmp(s, "div") == 0)
   res = (double)i / j;
  else if(strcmp(s, "mod") == 0)
   res = i % j;
  else if(strcmp(s, "power") == 0)
   res = pow(i,j);
  else
   continue;
 
  printf("%4d %s %4d = %10.2f\n", i, s, j, res);
  scanf("%s %d %d", s, &i, &j);
 
 }

 return 0;
}
====

by Joe & Soohy 2007. 1. 9. 09:39