본문 바로가기

Computer Science/따라하며 배우는 C

03 문자열과 형식 맞춘 입출력

728x90

문자열 입출력하기



#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
 char fruit_name; //stores only one character

 printf("what is your fruit? \n");

 scanf("%c", &fruit_name); // &

 printf("You like %c \n", fruit_name);

 return 0;

}

다음과 같이 문자열 한 글자를 입력받을 수 있다.

여러 문자열을 입력받고 싶다면 아래와 같이 입력하면 된다.


#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
 char fruit_name[40]; //stores only one character

 printf("what is your fruit? \n");

 scanf("%s", fruit_name); // &

 printf("You like %s \n", fruit_name);

 return 0;

}

달라진 점은 다음과 같다.

  1. [40]과 같이 문자열 수를 할당해 배열로 바꾼다.
  2. %s로 바꿔준다.
  3. &를 없애준다!!
    &를 없애줄 수 있는 이유는, fruit_name[40] 자체가 문자열을 접근하는 메모리 주소 자체를 나타내기 때문에 &가 필요없기 때문이다.

sizeof 연산자



#include <stdio.h>
#include <stdlib.h> //malloc()

struct Mystruct //4에서 사용
{
 int i;
 float f;
};


int main() 
{
 /* 1. size of basic types*/

 int a = 0;
 unsigned int int_size1 = sizeof a;
 unsigned int int_size2 = sizeof(int);
 unsigned int int_size3 = sizeof(a);

 size_t int_size4 = sizeof(a);
 size_t float_size = sizeof(float);

 printf("size of int = %u bytes \n", int_size1);
 printf("size of int = %zu bytes \n", int_size4);
 printf("size of float type = %zu bytes\n\n", float_size);

 /* 2. sizeof arrays*/

 int int_arr[30]; //int_arr[0]=1024;
 int* int_ptr = NULL; //pointer: 추후 설명 
 int_ptr = (int*)malloc(sizeof(int) * 30);

 printf("size of array = %zu bytes \n", sizeof(int_arr));
 printf("size of pointer = %zu bytes \n", sizeof(int_ptr));

 /* 3. sizeof character array*/

 char c = 'a';
 char string[10]; //maximally 9 char + '/0' (null character)

 size_t char_size = sizeof(char);
 size_t str_size = sizeof(string);

 printf("size of char type = %zu bytes \n", char_size);
 printf("size of string type = %zu bytes \n", str_size);

 /* 4. size of structure */

 printf("%zu \n", sizeof(struct Mystruct)); // 4bytes + 4bytes

 return 0;
}

배열, 동적 할당을 받는 메모리, string 등등 각각 인지하자.(추후에 자세히 설명)

문자열이 메모리에 저장되는 구조



int main()
{
 int a = 1;
 int int_arr[10] = { 0,1,2,3,4,5,6,7,8,9 };

 printf("%i %i %i \n", int_arr[0], int_arr[1], int_arr[9]);

 char c = 'a';
 char str1[10] = "hello";
 char str2[10] = { 'H', 'i' };

 printf("%c\n", c);
 printf("%s\n", str1);
 printf("%s\n", str2); //array 중 0을 만나면 printf 내부에서 종료함!

 printf("%hhi %hhi %hhi %hhi %hhi \n", 
  str2[0], str2[1], str2[2], str2[3], str2[4]); //0도 출력하게 test

 //char str3[10] = "hello,world"; //array size is not enough
 char str3[20] = "hello, world"; //array size is enough
 printf("%s\n", str3);

 char str4[20] = "hello, \0world"; //"\0" can stop printf!
 printf("%s\n", str4);



}

strlen() 함수



#include <string.h> //strlen and more
int main()
{
 char str1[100] = "hello";
 char str2[] = "hello";
 char str3[100] = "\0"; //빈칸과 \0(null)은 다르다!
 char str4[100] = "\n";

 printf("size: %zu len: %zu \n", sizeof(str1), strlen(str1));
 printf("size: %zu len: %zu \n", sizeof(str2), strlen(str2));
 printf("size: %zu len: %zu \n", sizeof(str3), strlen(str3));
 printf("size: %zu len: %zu \n", sizeof(str4), strlen(str4));

 /* Extra */
 char *str5 = (char*)malloc(sizeof(char) * 100);
 str5[0] = 'H'; str5[1] = 'e'; str5[2] = 'l'; str5[3] = 'l'; str5[4] = 'o';
 str5[5] = '\0';
 printf("%zu %zu \n", sizeof(str5), strlen(str5));




 return 0;
}

기호적 상수와 전처리기 #define


3.141592 PI와 같이, 한 번 define 해두면 계속 편리하게 사용할 수 있는 symbolic constants를 사용하자.

주로 대문자로 define 해준다!


#define PI 3.141592f
#define AI_NAME "Jarvis"
int main()
{
 float radius, area;

 printf("I'm %s \n", AI_NAME);
 printf("please input radius \n");

 scanf("%f", &radius);

 area = PI * radius * radius; 

 printf("area is %f \n", area);

 return 0;
}

명백한 상수들(Manifest Constants)


  • Manifest Constants: A value that is assigned to a symbolic name at the beginning of a computer program and is not subject to change during execution.
  • Mainly uses limits.h and float.h

#include <limits.h> //INT_MAX, ... , etc
# include <float.h> //FLT_MAX, ..., etc

printf() 함수의 변환 지정자들


printf(제어-문자열, 아이템1, 아이템2, ...)



int main()
{
 double d = 3.14159265358979323846264388327950; //가능한 메모리만큼 알아서 짤림

 printf("%c\n", 'A'); //글자 하나만 표현할때는 작은 따옴표!
 printf("%s", "i love you\n");
 printf("Even if there's a small chance, \
we owe this to everyone. \n");

 printf("\n");
 printf("%d %i %i %i \n", 1004, 1234, INT_MAX, UINT_MAX); //UINT_MAX overflow로 -1 출력
 printf("%u %u %u \n", 1024, -1, UINT_MAX); // -1을 넣어서 overflow 발생

 printf("\n");
 printf("%f %f %lf\n", 3.141592f, d, d); //l in lf is ignored
 printf("%a %A\n", d, d);
 printf("%e %E\n", d, d);

 printf("\n");
 printf("%g %g\n", 123456.789, 1234567.89); //%g 는 자동으로 %f, %e 중 골라서 출력함
 printf("%G %G\n", 123456.789, 1234567.89);
 printf("%g %g\n", 0.00012345, 0.000012345);
 printf("%G %G\n", 0.00012345, 0.000012345);

 printf("\n");
 printf("%o\n", 9);
 printf("%p\n", &d); // pointer of operator // d변수가 사용하는 memory address 출력


 printf("\n");
 printf("%x %X\n", 11, 11); //소, 대문자로 16진수 출력
 printf("%% \n", d); // Note the warning. d is ignoreds

변환 지정자의 수식어들


형식 지정자

imageimage

cpluscplus 홈페이지 참고


int main()
{
 printf("%10i\n",1234567 ); 
 printf("%-10i\n",1234567 );

 printf("%+i %+i\n", 123, -123);
 printf("%i   %+i\n", 123, -123);

 printf("%X\n", 17);
 printf("%#X\n",17 );

 printf("%05i\n", 123); //숫자앞에 0을 붙이면 0으로 빈칸을 채운다.
 printf("%*i\n", 7, 456); //7이 *자리에 들어가게 된다!

 printf("\n ---------Precision--------- \n");
 printf("%.3d\n", 1024);
 printf("%.5d\n", 1024);
 printf("%.3f\n", 123.1234567);
 printf("%10.3f\n", 123.1234);
 printf("%010.3f\n", 123.1234);
 printf("%.5s\n", "ABCDEFGHI");
 printf("%.s\n", "ABCDEFGHI"); // %.만 넣으면 숫자 0이 들어간것과 동일하게 작동함

 printf("\n ---------Lenght--------- \n");
 printf("%hhd %hd %d\n", 257, 257, 257);
 printf("%d %lld %lld\n", INT_MAX + 1, INT_MAX + 1, 2147483648LL); //x86, x64 결과가 다름!

 return 0;

}
image

printf()함수가 인자들을 해석하는 과정과 주의사항



int main()
{
 float n1 = 3.14;//4bytes
 double n2 = 1.234; //8bytess
 int n3 = 1024; //4bytes

 printf("%f %f %d\n -------------- \n\n", n1, n2, n3);

 //Note the warnings in output window

 printf("%d %d %d \n\n", n1, n2, n3);  // 4, 4, 4 (N, N, N)
 printf("%lld %lld %d \n\n", n1, n2, n3); // 8, 8, 4 (N, N, Y)
 printf("%f %d %d \n\n", n1, n2, n3);  // 8, 4, 4 (Y, N, N)
 printf("%f %lld %d \n\n", n1, n2, n3);  // 8, 8, 4 (Y, N, Y)

}
image
  • float는 printf()에 입력으로 들어갈 때, double(8byte)로 받게 된다. 그렇기 때문에, 출력 형식도 8byte로 지정을 해 줘야 뒤쪽에 출력할 n2, n3로 문제 없게 출력된다.

scanf() 함수의 사용법


  • 차이점, 주의사항 위주 설명
image

출처: https://www.cplusplus.com/reference/cstdio/scanf/


 /* mutliple inputs with blank separators*/

 int i;
 float;
 char str[30];
 scnaf("%d %f %s\n", &i, &f, str); //note % is absent in front of str!
 printf("%d %f %s\n", i, f, str);


/* unsigned as unsigned*/
unsigned i2;
scanf("%u", &i2); //try negative number
printf("%u\n", i2);

/* floating point numbers*/
// l for double for %f, %e, %E, %g

double d = 0.0;  //CAUTION: printf와 float가 대응된다고 생각하지 말기
scanf("%lf", &d); //lf, try E notation //lf or f? Try!
printf("%f\n", d); // f


/* width*/
char str[30];
scanf("%5s", str); //width
printf("%s \n", str);

/* h modifier*/
char i;
scanf("%hhd", &i); //char type!!(signed char -128~+127) //try large numbers
printf("%i \n", i);

/* integer with characters*/
int i;
scanf("%i", &i); //try 123ab, 123a456
printf("%i\n", i);

/* j modifier */
intmax_t i; //long long int_max 제공
scanf("%ji", &i); //j는 int_max 받아들이는 의미로 붙임
printf("%ji", i);

/* regular characters */
int a, b;
scnaf("%d, %d", &a, &b);
printf("%d %d \n", a, b);

/* char receives blank*/
int a, b;
char c;
scanf("%d%c%d", &a, &c, &b); //try  123 456 (blank)
printf("%d|%c|%d", a, c, b); // |: separator

/* return value of scanf */
int a, b;
int i = scanf("%d %d", &a, &b); // return value: item을 몇 개나 받았는지
printf("%d", i); //2!

/* modifier for printf() */ㅉ
 int i = 123;
 int width = 5; //from script file, scanf, etc.

 printf("input width:");
 scanf("%d", &width); //width를 지정할 수 있게

 printf("%*d\n", width, i);
728x90

'Computer Science > 따라하며 배우는 C' 카테고리의 다른 글

07 If문  (0) 2022.03.31
06 For  (0) 2022.03.31
04 연산자  (0) 2022.03.11
02 데이터와 C언어  (0) 2022.03.03
01 C 언어를 소개합니다.  (0) 2022.03.03