inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Nhập môn giải bài toán bằng thuật toán cho việc làm CNTT (với C/C++): Luyện thi viết mã

이 오류는 왜 뜨는 걸까요?

Đã giải quyết

6410

SEO

5 câu hỏi đã được viết

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으로 종료되지 않을수도 있습니다

라는 오류문구가 뜹니다.

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

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

모르겠어요 코테 준비 같이 해요! C++

Câu trả lời 1

2

RON

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++)

{ }

 

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

 

0

SEO

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

테스트 케이스 질문

0

373

1

병합정렬 시간복잡도 질문

0

462

1

41.연속된 자연수의 합 문제풀이에서 수학적인 원리를 모르고 있습니다.

0

1345

2

질문드립니다.

0

376

1

질문드립니다!

0

430

1

dev 프로그램 질문

0

275

1

문제가 이해가 안되요

0

376

1

4번 나이차이 문제 접근법 질문 드립니다.

0

307

1

source file not compiled

0

1047

3

59번 질문드립니다.

0

372

1

25번 문제 질문

0

349

1

4. 나이차이 문제 질문입니다.

0

372

1

90번 라이언 킹 심바 1번 테스트 케이스

0

470

1

71번 문제 전역 변수 질문 있습니다

0

365

1

75번, 79번 priority_queue관련

1

356

1

75.최대 수입 스케줄

0

400

2

복면산 정답의 수

0

432

1

테스트 케이스에 대해서

0

445

1

수업 내용 질문입니다!

1

232

1

풀어보면 좋은 문제 목록 - 2580 스토쿠 DFS 질문입니다!!

0

822

2

12. 플로이드-와샬(그래프 최단거리) . 27:25초

0

255

1

다른 풀이 방식

0

317

1

크루스칼 vs 프림

0

306

1

숫자 총개수 small 질문있습니다.

0

243

1