-
C++ sizeof() 함수와 strlen()의 차이Knowledge/C++ 2019. 7. 16. 13:40반응형
BOJ 8958번 문제 ( https://www.acmicpc.net/problem/8958 ) 를 풀면서 알게된 것
먼저 이 개념을 확실히 해야한다.
sizeof() - 실제로 차지하고 있는 메모리의 크기를 구한다.
strlen() - 문자열의 길이를 구한다. 이 때 길이는 NULL 문자를 만날 때까지의 문자수를 센다. unsigned int ( 부호 없는 정수 ) 를 반환한다
이 개념을 정확히 인지하지 못하고 있던 나는 아래와 같은 코드를 작성해 슬랙에 질문을 올렸다
1234567891011121314151617181920212223242526272829303132333435#include <iostream>#include <cstring>using namespace std;int main(void){int total, point,n;char cArr[80];//테스트 케이스의 갯수를 입력받는다cin >> n;for(int i=0;i<n;i++){cin >> cArr;//라인마다 받아서 배열에 저장total = 0;point = 0;// 토탈 , 포인트 초기화//for(int j=0; j< (sizeof(cArr) / sizeof(*cArr)) ; j++){ // (X)//for(int j=0; j<sizeof(cArr)/sizeof(cArr[0]); j++){ // (X)for(int j=0; j<strlen(cArr); j++){ // (O)// 저장한 배열 크기만큼 반복if(cArr[j]=='O'){point++;// O일때는 점수 키우고}else{point = 0;// O가 아니면 point 0으로 만든다}total += point;// 합산}cout << total << endl;}}cs Dev C++로 돌리면 테스트 케이스 넣고 돌릴 때는 결과값이 바르게 나오는데
백준으로 제출만하면 strlen을 사용했을 때만 통과가 됩니다. 이유가 뭔가요? 라고
당시엔 '이상하다. 문자열 길이만큼 돌리는 건 똑같을텐데 왜 위에 두개는 안되지?' 싶었다.
위에서 정리한 개념을 명확히 인지하고 보면
크기가 80인 배열을 선언해놓고 실제 차지하고 있는 메모리 크기를 구하는 sizeof()를 써대니 실패가 뜨는게 당연..
반면 strlen()은 배열의 크기를 80만큼 선언하고 사용해도
null문자를 리턴할 때까지의 문자열 길이를 세서 반환해주기 때문에 맞는게 당연..
아무튼 그래서 정답은 맞췄는데 사실 이 코드도 완전한 건 아니다.
문제가 좀 있는데 힌트는 위에 적은 strlen()의 개념에 있는데 그건 주제가 좀 다르니 추가 포스팅으로 계속..!
참조
반응형'Knowledge > C++' 카테고리의 다른 글
comparison between signed and unsigned integer expressions 원인 및 해결 방법 (0) 2019.07.16 C++ 변수 여러개를 선언과 동시에 초기화 할 때 주의할 점 (0) 2019.07.16 C++ 최소값과 최대값을 구하는 함수 (0) 2019.07.16 C++ EOF 처리 방법 ( 백준 10951 A+B - 4 ) (6) 2019.07.11 문자열을 출력하고 줄을 바꿔주는 puts() 함수 (0) 2019.07.08