반응형

공부를 하다 보니 "cout은 느리다 printf를 써라", "cin은 느리다 scanf를 써라"라는 글을 보았다.

 

얼마나 느리다는거지?

 

궁금해서 바로 테스트 해보았다.

 

#include <stdio.h>
#include <iostream>
#include <time.h>

int main()
{
	using namespace std;

	char let = 'z';
	char str[5] = "abc";

	clock_t start_time = clock();

	for (int i = 1; i <= 50000; i++)
		printf("z %c abc %s\n", let, str);
		//cout << 'z' << let << "abc" << str << endl;

	printf("%dms\n", clock() - start_time);
	system("pause");

	return 0;
}

scanf와 cin의 속도 비교보다는 printf와 cout의 속도 비교가 비교적 쉬울 거 같아서 clock 함수 사용을 위해 time.h 헤더 선언을 하고 printf와 cout의 속도를 비교할 수 있는 코드를 짜봤다.

 

원리는 간단하다.

printf와 cout를 5만 번(ㅋㅋㅋㅋㅋ) 호출하는데 호출 전 시간과 5만 번의 반복문을 끝내고 난 뒤의 시간을 비교하는 것이다.

 



7초 조금 안되게 걸렸다.

바로 cout도 측정을 해본다.

공평성(?)을 위해 따로따로 실행하였다.

 



14초가 걸렸다.

 

5만 번을 돌리기 전에 간단하게 100번만 돌려봤는데 각각 30ms 60ms 두 배 차이가 났는데 5만번을 돌렸을 때에도 2배 차이가 난다.

 

결론은 확실히 cout이 느리다.

 

반응형
반응형

https://gun-ny.tistory.com/17

시작하기에 앞서 문자열로 예를 든 것일 뿐 조건만 맞는다면 다른 자료형도 출력이 가능하다.

그리고 scanf_s 같이 표준 입력 함수 이름 뒤에 _s가 붙은 이름들의 배경은 위의 글을 참고하면 된다.

 

입력 함수 및 객체 목차

문자 및 문자열 입력 함수 및 객체(띄어쓰기 입력 불가)

  • scanf
  • fscanf
  • cin(C++)

 

문자열 입력 함수(띄어쓰기 입력 가능)

  • gets
  • fgets

 

문자 입력 함수

  • getchar
  • getc
  • getch(conio.h 선언 필요)
  • fgetchar
  • fgetc

 

입력 함수 및 객체 요약

출력 함수 때보다 더 간단히 요약하면

띄어쓰기가 포함된 문자열을 입력할 때에는 gets, fgets

아니면 인수를 여러개 받을 수 있는 scanf, fscanf, cin을 사용하자

 

문자를 입력받을 경우

getch 이외 다 비슷하게 기능을 수행하지만 대중적(?)으로 사용하는 getchar을 쓰자

getch는 conio.h 헤더 포함을 선언해 주고 키를 누르는 순간 반응하길 원할 때 쓰자

 

스트림을 지정 해야할 경우

문자열의 경우 fscanf, fgets

문자의 경우 getc, fgetc 중 하나를 사용하면 된다.

 

문자열의 경우 띄어쓰기가 없다면 scanf(fscanf) 띄어쓰기가 있다면 gets(fgets)

문자의 경우 getchar(fgetc), getch를 주로 사용한다고 생각하자( ()은 스트림 지정시)

cin도 많이 사용하나 출력 함수 설명 때와 마찬가지로 scanf에 비해 느리다.

 

 

 


 

 

문자 및 문자열 입력 함수 및 객체(띄어쓰기 입력 불가)

특징

  • 문자와 문자열 입력 가능('a', "a", "abc")
  • 띄어쓰기 입력 불가

 


scanf

scanf 예제

	char ch;
	char let;
	char str[5];

	// 문자 변수, 문자열 변수 상관없이 섞어서 입력 가능
	// 인수(argument) 여러개 호출 가능
	scanf("%c %c", &ch, &let);
	scanf("%s", str);

	// 대입 불가
	//scanf('a', &let);
	//scanf("abc", str);

	printf("%c %c %s", ch, let, str);

scanf 출력


a b
abc
a b abc

 


fscanf

fscanf 예제(띄어쓰기 입력 시)

	char ch;
	char let;
	char str[5];

	// 문자 변수, 문자열 변수 상관없이 섞어서 입력 가능
	// 인수(argument) 여러개 호출 가능
	fscanf(stdin, "%c %c", &ch, &let);
	fscanf(stdin, "%s", str);

	// 대입 불가
	//scanf('a', let);
	//scanf("abc", string);

	printf("%c %c %s", ch, let, str);

fscanf 출력(띄어쓰기 입력 시)


a b
ab c
a b ab

 


cin

cin 예제

	using namespace std;

	char ch;
	char let;
	char str[5];

	// 문자 변수, 문자열 변수 상관없이 섞어서 입력 가능
	// 인수(argument) 여러개 호출 가능
	cin >> ch >> let >> str;

	printf("%c %c %s", ch, let, str);

cin 출력


a b abc
a b abc


 

 

 


 

 

문자열 입력 함수(띄어쓰기 입력 가능)

특징

  • 문자열만 입력 가능("a", "abc")
  • 띄어쓰기 입력 가능

 


gets

gets 예제

	char ch;
	char let;
	char str[5];

	// 문자 변수 입력 불가
	//gets(let);

	// 인수(argument) 1개로만 호출 가능
	//gets(ch, let, str);

	gets(str);

	printf("%s", str);

gets 출력


abc
abc

 


fgets

fgets 예제(띄어쓰기 입력 시)

	char ch;
	char let;
	char str[5];

	// 문자 변수 입력 불가
	//fgets(let, 1, stdin);

	// 인수(argument) 1개로만 호출 가능
	//fgets(ch, let, str, 5, stdin);

	fgets(str, 5, stdin);

	printf("%s", str);

fgets 출력(띄어쓰기 입력 시)


ab c
ab c

 

 

 


 

 

문자 입력 함수

특징

  • 문자만 입력 가능('a')

 


getchar

getchar 예제

	char ch = getchar();
	printf("%c", ch);

getchar 출력


a
a

 


getc

getc 예제

	char ch = getc(stdin);
	printf("%c", ch);

getc 출력


a
a

 


getch
(conio.h 선언 필요)
(입력시 바로 반응)
(a 한개만 출력)

getch 예제

	char ch = getch();
	printf("%c", ch);

getch 출력


a

 


fgetchar

fgetchar 예제

	char ch = fgetchar();
	printf("%c", ch);

fgetchar 출력


a
a

 


fgetc

fgetc 예제

	char ch = fgetc(stdin);
	printf("%c", ch);

fgetc 출력


a
a

 

반응형
반응형

시작하기에 앞서 문자열로 예를 든 것일 뿐 조건만 맞는다면 다른 자료형도 출력이 가능하다.

 

출력 함수 및 객체 목차

문자열 출력 함수

  • printf
  • puts
  • fprintf
  • fputs

 

문자 출력 함수

  • putchar
  • putc
  • fputchar
  • fputc

 

문자 및 문자열 출력 객체

  • cout(C++)

 

출력 함수 및 객체 요약

차이점으로 요약할 수 있을거 같다.

 

문자냐 문자열이냐

  • 문자열(printf, puts, fprintf, fputs)
  • 문자(putchar, putc, fputchar, fputc)
  • 문자 및 문자열(cout)

자동 개행(줄바꿈)이 되냐 안되냐

  • 자동 개행(puts)

출력할 변수가 1개냐 여러 개냐

  • 인수 여러개 호출 가능(printf, fprintf, cout)

스트림을 지정하냐 안 하냐(예를 들면 콘솔 출력이냐, 파일 출력이냐)

  • 지정(fprintf, fputs, fputchar, fputc, putc)

예를 4가지 들면

(문자열)을 (자동 개행) 안되게 (인수 여러개)로 콘솔 출력 할 것이다. -> printf

(문자열)을 (자동 개행) 안되게 (인수 여러개)로 (콘솔 스트림 지정)=콘솔 출력 할 것이다. -> fprintf

(문자)를 (자동 개행) 안되게 (인수 1개)로 (파일 스트림 지정)=파일 출력 할 것이다. -> putc, fputchar, fputc

(문자 및 문자열)을 (자동 개행) 안되게 (인수 여러개)로 콘솔 출력 할 것이다. -> cout

 

예를 들긴 했지만 printf와 fprintf를 제일 많이 사용한다.

cout도 많이 사용하나 printf에 비해 느린 편이다.

 

 

 


 

 

문자열 출력 함수

특징

  • 문자열 또는 문자열 변수만 출력 가능("abc")
  • 문자열 처리한 문자는 출력 가능("a")

 


printf

printf 예제

	char let = 'z';
	char str[5] = "abc";

	// 문자 출력 불가
	//printf('z');
	// 문자 변수 출력 불가
	//printf(let);

	// 문자열 처리한 문자는 출력 가능
	printf("z");

	printf("abc");
	printf(str);

	// 인수(argument) 여러개 호출 가능
	printf("abc%s%s%s", str, str, str);

printf 출력


zabcabcabcabcabcabc

 


puts

puts 예제

	char let = 'z';
	char str[5] = "abc";

	// 문자 출력 불가
	//puts('z');
	// 문자 변수 출력 불가
	//puts(let);

	// 문자열 처리한 문자는 출력 가능
	puts("z");

	puts("abc");
	puts(str);

	// 인수(argument) 1개로만 호출 가능
	//puts("abc%s", str);

puts 출력


z
abc
abc

 


fprintf

fprintf 예제

	char let = 'z';
	char str[5] = "abc";

	// 문자 출력 불가
	//printf('z');
	// 문자 변수 출력 불가
	//printf(let);

	// 문자열 처리한 문자는 출력 가능
	fprintf(stdout, "z");

	fprintf(stdout, "abc");
	fprintf(stdout, str);

	// 인수(argument) 여러개 호출 가능
	fprintf(stdout, "abc%s%s%s", str, str, str);

fprintf 출력


zabcabcabcabcabcabc

 


fputs

fputs 예제

	char let = 'z';
	char str[5] = "abc";

	// 문자 출력 불가
	//puts('z');
	// 문자 변수 출력 불가
	//puts(let);

	// 문자열 처리한 문자는 출력 가능
	fputs("z", stdout);

	fputs("abc", stdout);
	fputs(str, stdout);

	// 인수(argument) 1개로만 호출 가능
	//fputs("abc%s", str, stdout);

fputs 출력


zabcabc

 

 

 


 

 

문자 출력 함수

특징

  • 문자 또는 문자 변수만 출력 가능('a')

 


putchar

putchar 예제

	char let = 'z';
	char str[5] = "abc";

	putchar('z');
	putchar(let);

	// 문자열 출력 불가
	//putchar("abc");
	// 문자열 변수 출력 불가
	//putchar(str);

putchar 출력


zz

 


putc

putc 예제

	char let = 'z';
	char str[5] = "abc";

	putc('z', stdout);
	putc(let, stdout);
    
	// 문자열 출력 불가
	//putc("abc", stdout);
	// 문자열 변수 출력 불가
	//putc(str, stdout);

putc 출력


zz

 


fputchar

 

fputchar 예제

	char let = 'z';
	char str[5] = "abc";

	fputchar('z');
	fputchar(let);

	// 문자열 출력 불가
	//fputchar("abc");
	// 문자열 변수 출력 불가
	//fputchar(str);

fputchar 출력


zz

 


fputc

fputc 예제

	char let = 'z';
	char str[5] = "abc";

	fputc('z', stdout);
	fputc(let, stdout);

	// 문자열 출력 불가
	//fputc("abc", stdout);
	// 문자열 변수 출력 불가
	//fputc(str, stdout);

fputc 출력


zz

 

 

 


 

 

문자 및 문자열 출력 객체(C++)

특징

  • 문자, 문자열, 문자 변수, 문자열 변수 상관없이 섞어서 쓸 수 있다.('a', "a", "abc")
  • 출력 함수에 비해 느리다.

 


cout

cout 예제

	using namespace std;

	char let = 'z';
	char str[5] = "abc";

	cout << 'z' << let << "abc" << str;

cout 출력


zzabcabc

 

반응형
반응형

문제 설명

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

 

제한 조건

  • phone_number는 길이 4 이상, 20이하인 문자열입니다.

입출력 예

phone_number return
"01033334444" "*******4444"
"027778888" "*****8888"

solution.c

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char *solution(const char *phone_number)
{
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    int phone_len = strlen(phone_number);
    char *answer = (char *)malloc(sizeof(char) * phone_len);

    for (int i = 0; i < phone_len; i++)
    {
        if (i > phone_len - 4 - 1)
            answer[i] = phone_number[i];
        else
            answer[i] = '*';
    }
    answer[phone_len] = '\0';

    return answer;
}

 

반응형

+ Recent posts