C

C기초 플러스 chap.4 문자열과 입출력 포맷

Barbarian developer 2024. 8. 7.

쫄지마라 제군들!

컴퓨터는 인간의 언어도 모르는 바보다! 

chap.4! 문자열과 입출력 포맷에 대해 알아본다!!

돌격!

 

학습 목표

  • 함수 : strlen()
  • 키워드 : const
  • 문자열
  • 문자열을 만들고 저장하는 방법.
  • Scanf()와 printf()를 사용하여 문자열을 읽고 출력하는 방법.
  • strlen()함수를 사용하여 문자열의 길이를 알아내는 방법.
  • C 전처리기의 #define지시자와 ANSI C의 const 변경자를 사용하여 기호 상수를 만드는 방법.
//4.1
//talkback.c --수다스럽지만, 정보를 주는 시스템
#include<stdio.h>
#include<string.h> //strlen() 프로토타입을 사용하기 위해
#define DENSITY 62.4 //신체밀도(입방피트당 파운드 수)
int main(void)
{
float weight, volume;
int size, letters;
char name[40]; //name은 영문자로 40개 넣을 수 있는 배열이다.

printf("하이! 이름이 뭐에요?\n");
scanf("%s", name);
printf("%s 씨, 몸무게는 몇 파운드나 나가요?\n",name);
scanf("%f", &weight);
size=sizeof name;
letters = strlen(name);
volume=weight / DENSITY;
printf("옳거니, %s 씨의 몸은 %2.2f입방피트를 차지합니다.\n",name, volume);
printf("그리고 이름이 %d글자니까,\n",letters);
printf("저장하려면 %d바이트가 필요합니다.\n",size);

return 0;
}

이번 챕터에서 공부할 내용이다! 몰라도 일단 쳐봐라! 이제 우린 컴퓨터랑 친해져야한다!

 


//4.2
/*praise1.c --몇 가지 유형의 문자열들을 사용한다.*/
#include <stdio.h>
#define PRAISE "you are an extraordinary being."
int main(void)
{

    char name[40];

    printf("실례지만 성험이 어떻게 되시는지?\n");
    scanf("%s", name);
    printf("반갑습니다, %s 씨. %s\n", name,PRAISE);

    return 0;
}

// 문자열 출력하기. 이렇게 보니 좀 직관적이긴 하다. define은 praise의 문자열을 저장하는 함수인듯 하다.

 

문자열 출력하기

  • char는 데이터형 함수. 이전 장에서 했다 아스키 코드 데이터 형이다!
  • 저기에 name[문자열+1]을 해주면 출력된다! +1을 해주는 이유는 nal(\0)이 숨어있다! 그 친구 방도 만들어줘야한다! 안그럼 친구 삐져서 다 안나온다! 문자 하나하나가 들어갈 방을 만들어 주는 작업이다!
  • %s는 문자열 지시자다! 문자 하나만 뽑을 때는 %c쓰면 된다! 알겠지만 저건 아스키 코드다!

//4.3
/*praise2.c*/
//사용하는 시스템이 %zd를 인식하지 못한다면
//%u 또는 %lu를 사용한다.

#include <stdio.h>
#include <string.h>     /*stlen() 프로토타입을 제공한다.*/
#define PRAISE "You are an extraodinary being"
int main(void)
{

    char name[40];

    printf("실례지만 성함이 어떻게 되시는지?\n");
    scanf("%s", name);
    printf("반갑습니다, %s씨. %s\n", name, PRAISE);
    printf("이름은 %zd글자인데 메모리 셀 %zd개를 차지합니다.\n",strlen(name), sizeof name);
    printf("감탄문은 %zd글자인데", strlen(PRAISE));
    printf("메모리 셀 %zd개를 차지합니다. \n", sizeof PRAISE);

    return 0;
}

//stlen()은 문자열의 크기를 문자 수로 알아낸다.

 

strlen()

  • 가장 먼저 #include <string.h>로 값을 호출해야 한다!! 나중에 쓸 strleln()에게 값을 저장해줄것이다!
  • char name[40];은 char라는 데이터 형의 변수인 name에 영문자로 40개를 넣을 수 있는 배열이다!
  • 한마디로 저긴 name이란 방에 40명의 바바리안 까지만 들어갈 수 있는 방이다!! 우랴!!
  • 아, strlen(name)은 그 안에 들어간 문자열의 갯수를 출력해준다!
  • sizeof는 문자열 끝에 자동으로 들어가는 null(\0)의 값까지 출력한다. strled 그런거 안한다! 문자열 갯수만 출력한다!

//4.4
/*pizza.c --피자 집에서 쓰는 용어로 상수를 정의한다.*/
#include<stdio.h>
#define PI 3.14159
int main(void)
{
    float area, circum, radius;

    printf("피자의 반지름이 얼마나?\n");
    scanf("%f", &radius);
    area=PI * radius * radius;
    circum=2.0 *PI*radius;
    printf("피자의 기본 매개변수는 다음과 같다:\n");
    printf("circumference=%1.2f, area=%1.2f\n", circum, area);

    return 0;
}

//#define 지시자는 문자 상수와 문자열 상수에도 사용 가능함.

 

#define

  • 얘는 자기 뒤에 오는 변수와 데이터를 나란히 나열하여 작성하면, 그 뒤에 값을 상수로 치환한다!
  • '상수'란 절대 변하지 않는 수다! 예를 들면 물은 100도에서 끓는다! 여기서 100은 상수다!
  • =은 쓰지 않는다. =을 쓰면 같이 저장되버린다! 

 

//4.5
//defines.c -- limits.h와 float.h에 정의되어 있는 기호 상수들을 사용한다.
#include<stdio.h>
#include<limits.h>  //정수의 한계
#include<float.h>   //부동소수점수의 한계
int main(void)
{

    printf("이 시스템이 표현하는 수의 한계:\n");
    printf("int형 최대값:%d\n", INT_MAX);
    printf("long long형 최소값:%lld\n", LLONG_MIN);
    printf("이 시스템에서 1바이트 %d비트이다.\n", CHAR_BIT);
    printf("double형 최대값: %e\n",DBL_MAX);
    printf("float형 최소값: %e\n",FLT_MIN);
    printf("float형 정밀도는 소수점 아래 %d자리까지\n", FLT_DIG);
    printf("float형 epsilon = %e\n", FLT_EPSILON);

    return 0;
}

// limits.h에 정의되어 있는 기호상수를 설명한 코드.

기호상수.

  • 음 쉽게 말하면, 얘들은 c언어에서 사용하는 기호상수의 최대치 및 최소치를 나타내는 친구들이다!
  • 자세한 내용은 아래 표를 참고하고, 그냥 알고만 넘어가자! 우린 int랑 double말고는 거의 안쓴다!

 

 


 

//4.6
/*printou.c -- 변환 지정자를 사용한다.*/

#include<stdio.h>
#define PI 3.141592
int main(void)
{

    int number =7;
    float pies = 12.75;
    int cost = 7800;

    printf("%d명의 경쟁자가 %f판의 딸기파이를 먹었다.\n", number, pies);
    printf("The value of pi is %f.\n", PI);
    printf("잘 가시라! 그대는 내가 소유하기에 과분하여라,\n");
    printf("%c%d\n", '$',2*cost);

    return 0;
}

//define을 통해 PI를 상수로 지정함. %d,%s,%f  요런 애들이 변환지정자임.

printf()

  • 변환 지정자를 원하는 위치에 놓고, 그 뒤에 number, pies를 반드시 변환 지정자 위치와 갯수를 맞춰야 한다!
  • 안맞추면 컴퓨터는 못알아먹는다. 하나하나 일일히 가르쳐주자!

 

//4.7
/*width.c -- 필드너비*/
#include <stdio.h>
#define PAGES 959
int main(void)
{
    printf("*%d*\n", PAGES);
    printf("*%2d*\n", PAGES);
    printf("*%10d*\n", PAGES);
    printf("*%-10d*\n", PAGES);

    return 0;

}

//변환지정자의 사용 방식을 설명한 코드이다. 필드너비를 지정해주는 방법. %d앞에 붙은 수는 10칸의 필드를 생성하고, 그 안에다 출력하라는 말임.

변환지정자 필드 너비

  • 변환지정자 앞에 정수를 입력하면 그만큼 필드의 너비를 만든다!
  • 쉽게 말하면 PAGES안의 데이터가 들어올 방의 크기다!
  • 방이 좁으면 자기들끼리 어떻게든 끼워 맞춰 들어간다!
  • 방이 남으면 왼쪽은 빈칸으로 두고, 오른쪽부터 맞춰서 들어간다!
  • -가 붙으면 반대로 왼쪽부터 채우고, 오른쪽을 비운다!

 

//4.10
/*flags.c —몇 가지 포맷 변경자 플래그를 보여준다.*/
#include<stdio.h>
int main(void)
{
    printf("%x %X %#x\n", 31,31,31);
    printf("**%d**% d**% d**\n", 42,42,-42);
    printf("**%5d**%5.3d**%05d**%05.3d**\n",6,6,6,6);
    
    return 0;
}
//변환지정 활용 첫번째는 16진수를 출력하는 변환지수임.

변환지수 포맷 변경자

  • 첫번째는 16진수를 출려가는 변환지수다!
  • 두번째는 지정자에 스페이스를 사용했을 때, 양수의 경우는 스페이스를 넣고, 음수의 경우는 스페이스를 넣지 않는다!
  • 세번째는 정밀도 지정자(%5.3d)를 사용하면 그 수를 지정한 최소자릿수 에 맞추는데 필요한 만큼 0으로 사용한다!
  •  

 

//4.15
// input.c —&를 언제 사용하는가
#include<stdio.h>
int main(void)
{
    int age;  //변수
    float assets; //변수
    char pet[30]; //문자열

    printf("나이, 재산, 좋아하는 애완동물을 입력하시오.\n");
    scanf("%d %f", &age, &assets); //여기에는 &를 사용한다.
    scanf("%s", pet); //문자배열에는 &를 사용하지 않는다.
    printf("%d $%.2f %s\n", age, assets, pet);

    return 0;
}

//&엔퍼센트라고 읽음. 얘는 데이터형의 값(정수, 실수같은거)을 읽을 때, 변수 앞에 쓰는 얘임!

&엔퍼센트 >>언제 사용하는가?

  • 데이터형의 변수 값을 입력할때 사용한다!
  • 다만, 문자배열에서는 사용하지 않으니 주의하자!

//4.16
/* varwid.c—필드 너비가 가변적이다*/
#include <stdio.h>
int main(void)
{
    unsigned width, precision;
    int number = 256;
    double weight = 242.5;

    printf("필드 너비를 입력하시오:\n");
    scanf("%d", &width);
    printf("Number:%*d:\n", width, number);
    printf("필드 너비와 정밀도를 함께 입력하시오\n");
    scanf("%d %d",&width, &precision);
    printf("weight=%*.*f\n",width,precision,weight);
    printf("종료!\n");

    return 0;
}
//첫번째 입력값에 넣은 수만큼 필드 너비를 준다.
//두번째 입력값에 넣은 두 수 만큼 필드 너비를 준다.
//scanf에서는 *을넣으면 입력한 값 만큼 스페이스!!

여기서부턴 아래 주석만 봐도 문제 없을 것 같다!! 패스!!

//4.17
/* skiptwo.c —입력에서 처음 2개의 정수를 건너뛴다.*/
#include<stdio.h>
int main(void)
{
    int n;

    printf("3개의 정수를 입력하시오:\n");
    scanf("%*d %*d %d", &n);
    printf("마지막으로 입력한 정수는 %d이다.\n",n);

    return 0;
}

//입력값 세개를 모두 출력시키고 하나의 특정한 열을 읽을 때 쓰는거임!! 저기서 골라 쓰고 싶은 것만 딱 골라서 출력하면 댐!! 이게 젤 쉽다!!

 

댓글