해결된 질문
작성
·
5.7K
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
2
문자열은 반드시 마지막에 널문자가 삽입 되어야합니다.
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++)
{ }
꼭 문자열이 아니더라도 포인터를 사용하시면 반드시 제일 먼저 널체크는 필수 입니다. 널체크를 안하시더라고 오류는 나지않지만, 프로그램의 안전성을 위해서 꼭 해야한다고 생각합니다.
우와.... 진짜 명쾌한 설명 너무너무 감사합니다! 한번보고 바로 이해되었어요!