• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    해결됨

이 오류는 왜 뜨는 걸까요?

22.01.18 13:37 작성 조회수 4.83k

0

문제를 풀다가 궁금한게 생겨서 질문을 올립니다.

제가 구현하고 싶은 부분은, 사용자로부터 문자열을 입력받아서 char형 배열에 저장하고,

for문을 돌려가며, 입력받은 문자열 중, 문자 'H'가 있는 인덱스값을 반환하기를 원합니다!

---------------------------------------------------------------------------------------

int main(int argc, char* argv[]) {

char data[10]; 

int indexOfH; // H가 위치한 인덱스를 알고자 함

scanf("%s", data);

for (int i = 0; i < strlen(data); i++) {

if (data[i] == 'H')

indexOfH = i;

}

printf("%d\n", indexOfH);

return 0;

}

--------------------------------------------------------------------------------------

간단하게 제 코드는 이렇습니다!

보통 문자열을 처음부터 끝까지 순회할 때, "문자열이 널문자를 만나기 전까지 순회한다"라고 강사님께서는 코드를 구현하시더라고요..

저는 처음에는 그 생각을 미쳐하지 못하고,

문자열의 길이를strlen함수를 통해서 얻어내서, 문자열의 길이보다 작을때까지, for문을 돌리는 방법으로 구현하였습니다.

제 생각에는 제 방법이 틀리지 않다고 생각을 했는데,

제가 짠 코드대로 컴파일을 하면,

C6054: 문자열이 0으로 종료되지 않을수도 있습니다

라는 오류문구가 뜹니다.

왜 이런 오류문구가 뜨고, 어떻게 하면 해결할 수 있는지 정말 궁금합니다!

답변해주시면 정말 감사하겠습니다!

답변 1

답변을 작성해보세요.

1

RON님의 프로필

RON

2022.01.19

C6054 | Microsoft Docs

 

문자열은 반드시 마지막에 널문자가 삽입 되어야합니다.

char data[10]을 전부 다 사용한다면, 총 10개의 데이터칸에서 9개를 사용하고 나머지 [9]에는 널문자가 삽입 되어야합니다. 문자열을 "Hello"를 입력하셧으면 [0]~[4]까지는 문자 [5]에는 널문자 이겠네요.

 

그렇기때문에 컴파일러에서 경고를 합니다. strlen은 널문자가 있을때까지 읽는 함수인데, 질문자님 코드로 작성하게 되면 scanf로 입력을 받고 바로 for문으로 검사하니 사용자가 널문자 까지 알차게 잘 넣을지, 혹은 오버해서 넣진 않을지 알 수가 없고,

이걸 런타임 때 밖에 알수 밖에없는데

이때 사용자가 실수로 널문자가 있어야하는 칸을 오버해서 기입을 한다면 크래시가 나면서 프로그램이 강제로 중단 됩니다.

 

극단적인 예를 들어, 게임을 다운받고 캐릭터 닉네임을 길게 작성했는데, 게임에서 허용한 닉네임 배열보다 더 길게 작성해 버렸다고

게임이 그냥 오류가 나면서 강제로 꺼지는 상황이 있으면 안되기 때문에, 그런걸 미연에 방지하기위해 혹여나 하고 경고해 준다고 생각하시면 됩니다. (이해를 돕기위한 예시입니다.)

 

꼭 strlen을 사용하고 싶으시면 위에 if문으로 널체크 하시면됩니다.

char data[10] = { 0 };  // 초기화

if(data[9] != '\0')  // 널 체크

return 0;

for (int i = 0; i < strlen(data); i++)

{ }

 

꼭 문자열이 아니더라도 포인터를 사용하시면 반드시 제일 먼저 널체크는 필수 입니다. 널체크를 안하시더라고 오류는 나지않지만, 프로그램의 안전성을 위해서 꼭 해야한다고 생각합니다.

 

SEO님의 프로필

SEO

질문자

2022.01.20

우와.... 진짜 명쾌한 설명 너무너무 감사합니다! 한번보고 바로 이해되었어요!