herawls   2년 전

-1로 다 초기화시킨 다음에 

아스키코드표 참고해서 나온 순서에 따라 al배열에 순서가 입력되게 하고, 만약 순서가 입력되고 다시 나온 알파벳이면 continue로 건너뛰게 하는 방식으로 작성했습니다. 

일단 문제에 나와있는 예제들은 잘 출력되고, 예제 제가 생각한 것으로 더 돌려봤는데 오류없이 잘 되는데 계속 채점에는 틀렸다고 나와서 질문 드립니다.

slah007   2년 전

우선 초기화하지 않은 상태의 strlen(str)는 알 수 없는 값이고 로컬에서 대부분 0으로 나오게 되어 입력을 받을 수가 없습니다. 아마 예제가 잘 출력되지 않을 것 같은데, 이 코드가 아니라 10줄에 sizeof(str)로 고쳤다고 가정하겠습니다.

이때 문제는 두 가지가 있습니다.

1. fgets가 sizeof(str)보다 하나 적은 개수의 문자열을 받아오기 때문에 정확히 길이가 100인 단어가 들어올 경우 마지막 글자를 입력 받지 못합니다.

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab

이 입력에 대해 j를 출력해보면 아마 j=98까지밖에 출력되지 않을 것이고 index가 99인 b를 찾지 못합니다. 이는 fgets에서 sizeof(str)+1로 고치면 해결됩니다.

2. fgets는 길이가 꽉 차는 100자 단어가 아닌 이상 마지막의 개행 문자 '\n'을 입력받을 것이고 12줄의 al['\n'-'a']는 음수 인덱스를 참조하게 됩니다.

str[j]가 개행 문자인지 확인하거나 맨 끝의 개행 문자를 지워줄 필요가 있습니다.

3. 이 문제에서는 별 상관 없지만 strlen(str)은 호출할때마다 str의 길이만큼의 시간이 들며, 타입도 unsigned long long이기 때문에 음수와 비교하면 터지는 등 별로 좋은 문법이 아닙니다. int형 변수에 strlen(str)을 한 번 저장해두고 for에 그 변수를 사용하는 것이 권장됩니다.

flappybird   2년 전

문제 해결과는 상관 없는건데, 출력부분(17~22번째 줄)에 공백문자를 숫자 사이에만 넣었는데, 굳이 이렇게 안 하시고 개행 전에 공백문자를 출력해도 문제 없이 동작합니다.

herawls   2년 전

덕분에 fgets와 scanf의 개행 문자 처리 방식을 확실하게 알았습니다.  친절한 설명 감사드립니다!

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