강의 정리/씨언어 백준

(오답노트) 백준(BOJ) 10809번, '\0'와 NULL은 다르다 - c언어

PurpleGuy101 2021. 12. 28. 00:47

알파벳 찾기 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 256 MB 105410 55844 46693 53.338%

문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

예제 입력 1 복사

baekjoon

예제 출력 1 복사

1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

출처

  • 문제를 만든 사람: baekjoon
  • 잘못된 데이터를 찾은 사람: djm03178
  • 데이터를 추가한 사람: djm03178

알고리즘 분류

https://www.acmicpc.net/problem/10809

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

 

/////////////////////////////////////////

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

int main() {

    int tracker ,alphabet;
    char a[100];
    
    scanf("%s", a);


    for (int i = 0; i < 26; i++) {

        tracker = -1;
        alphabet = i + 'a';
        int j = 0;
        while (a[j] != 0) {
            if (a[j] == alphabet) {
                tracker = j;
                break;
            }
            j++;
        }
        printf("%d ", tracker);
    }
   

    return 0; 
}

//////////////////////////////////

겁나게 많은 오류를 저질렀다.

그런고로 f9으로 브레이크포인트를 잡아가며 겨우겨우 오류를 찾아내야했다.

 

while문에서 a[j]가 NULL을 만나면 멈추도록

while (a[j] != '\0') {
            if (a[j] == alphabet) {
                tracker = j;
                break;
            }
            j++;
        }

 

이렇게 코드를 짰으나, 문자열의 끝에서도 j가 NULL값을 인식하지 못하고

계속해서 증가하는 것이다.

왜 그런가 했더니 NULL이라는 단어는 널 포인터,Null Pointer 라고 칭하며
(void*)0 이라고 헤더파일에서 못박아 둔것이다.

포인터초기화시에 사용하는 것이 이 NULL이다.

 

허나 '\0'은 NUL 값으로 칭한다. 널문자, Null Character라고 하며 

문자열의 마무리를 나타낼 때 사용하는 값이 이 NUL이다.

char type, 문자형의 값을 가지며 문자 그자체를 나타낼 아스키코드의 Char Set의 0번째 문자이다.

 

https://noirstar.tistory.com/16

 

[C/C++]NULL, NUL, 0, \0 의 차이점을 알아보자.

코드를 짜다보니 NULL , NUL, 0, \0 이것들의 차이점이 문득 궁금해졌습니다. 인터넷을 뒤져보니 이미 많은분들이 이것들의 차이점에 대해 적어 놓으셨더라구요. 헷갈릴 수있는 것들이기에 자세하

noirstar.tistory.com

위의 글을 참조하여 해답을 얻었다.

 

"char *ptr = NULL 과 char *ptr = 0 은 같은 의미라 볼 수 있습니다. 

그러나 int a = NULL 과 int a = 0 의 의미는 다릅니다.

왜냐하면 전자의 경우, NULL의 의미는 a 변수에 주소값 0 을 넣는것이고 후자는 정수 0을 a변수에 넣는다는 뜻입니다."

"NULL - 0x00000000 or 0x00000000'00000000 (32 vs 64 bit) 로 표현됩니다."

 

NUL - 0x00 or 0x0000 (ASCII vs 2byte unicode)

'\0' - 0x00  '0' - 0x30  (ASCII)

 

결국 int a = 0은 정수형 변수 a의 '값'에 (숫자 0)에 해당하는 0x30을 넣는 것.

int a = NULL 은 정수형 변수 a의 '값'에 (NUL)에 해당하는 0x00을 넣는 것이다.

 

char *ptr = NULL 과 char *ptr = 0은 

둘다 주소를 0x000.... 으로 설정하는데 이 0x000... 의 주소가 '존재하지 않는 메모리 주소'를 뜻하기에 같은것 이란다.

 

C언어에서는 0을 nullpointer constant로 정해놓았기 때문에 0을 적어도 

헤더파일에서 '존재하지 않는 메모리주소'인 NULL로 바꿔준다?

하지만 다른 프로그램에서는 0=NULL이라고 안해놓는 곳도 있어서 NULL을 써야 한다고 한다?

 

자세히는 모르겠다. 일단 NUL이랑 NULL을 구분하는게 이번문제의 핵심이다.