pmch0325   3년 전

아래 코드에서 stdio 안쓰고

scanf -> cin

strcmp -> string 관계연산자 ( in1=="<br" 같이 )

strlen -> string.length()

이렇게 바꿔서 채점하면 통과되는데 scanf로 한건 시간초과가 나네요. 왜 그럴까요????

1. char 배열로 문자열을 저장할 땐 끝에 NULL 문자가 있어야 하기 때문에 80자를 입력받는 배열은 최소 81칸이 되어야 합니다.

2. (직접적인 시간 초과의 원인은 아닌 것 같지만) strlen은 O(N)이기 때문에 strlen(in1)을 24, 33번째 줄에 2번 쓰기 보다는 미리 int len = strlen(in1)과 같이 미리 값을 계산해두고 len을 참조하는게 좋습니다.

3. 

---

아래 코드에서 딱

scanf -> cin

strcmp -> string 관계연산자 ( in1=="<br" 같이 )

이렇게 바꿔서 채점하면 통과되는데 scanf로 한건 시간초과가 나네요.

---

와 같이 말로 설명하지 말고 통과된 코드를 직접 보여주세요.

djm03178   3년 전

scanf는 입력의 끝을 만나면 EOF를 반환하는데 이는 참으로 간주되기 때문에 루프를 계속 돌게 됩니다.

pmch0325   3년 전

답변 감사합니다

문자열이나 입출력에 대해 자세히 알지를 못해서 몇 개 추가질문이 있어요

1.

문자열을 입력받을 때 문자열의 끝에 '\0'문자가 자동으로 추가되는건가요?

같은 char배열 변수에 다른 문자열을 반복적으로 입력받는 경우

앞에 입력받은 문자열보다 짧은 문자열을 입력받아도 널문자 전까지만을 인식하게 되는거 맞나요??

배열 변수 자체에는 앞에 입력받고 덮어씌워지지 않은 char도 남아있죠?

2.

인터넷에 찾아보니 EOF가 -1이라는데 그래서 참으로 간주되는 건가요?

1. 네, 애초에 C언어에서는 문자열의 끝을 \0으로 판단하니 알아서 마지막에 \0을 붙입니다.

만약 같은 char 배열(10칸짜리)에 맨 처음엔 abcd를 입력하면

a b c d \0 ? ? ? ? ?

가 들어갔다가 이후에 xy를 넣으면

x y \0 d \0 ? ? ? ? ?

가 되겠죠.

만약 qqqqqttttt를 넣으면

q q q q q t t t t t \0 이 기록됩니다만 맨 마지막 \0은 array index를 벗어나서 기록되기 때문에 runtime error의 원인이 될 수 있습니다.

2. 네, while(x)는 x가 int일 때 0이면 false, 그 외의 값에서는 true가 됩니다.

댓글을 작성하려면 로그인해야 합니다.