Exam 02
저번 시험에서 접속방법까지는 시도해봤지만 깃에 올리는건 처음이라 걱정이 됐었다. 거의 맨땅에 헤딩하는 식으로 폴더를 만들고 문제를 올렸는데 정상적으로 채점이 돼서 다행이었다. 문제는 2문제밖에 풀지 못했다.
| 0번 문제는 명령인자로 들어온 문자열이 3가지 조건(①’a’가 포함된 경우, ②’a’가 없는 경우, ③인자가 1개가 아닌 경우)일 때 ‘a’를 출력하고 개행문자를 쓰는거였다.(./a.out | cat -e 를 실행시키면 a$ 가 출력될 수 있도록) 하지만 argc와 argv를 rush때 잠깐 써본 것 빼곤 실제로 사용해 본 적이 없어서 계속 오류가 났다. 그래서 조건을 다시 살펴보니 인자의 입력여부, ‘a’의 포함여부에 상관없이, 즉, 모든 경우에 a$가 출력되면 되는 문제였다. 하지만 또 문제가 생겼는데 개행문자를 어떻게 출력하느냐였다. 파이썬에서는 \n을 썼던 기억이 있는데 이상하게 계속 오류가 났다.(다음날 다시 해보니 그땐 잘 됐다..) 그래서 하는 수 없이 man ascii를 찾아서 엔터가 있을법한 번호인 0~32를 전부 출력해보기로 했다. 그 결과 10이 ascii코드로 엔터에 해당한다는 사실을 알게됐다. |
1번 문제는 main함수에서 주어진 문제열을 거꾸로 출력하는 문제였다. 이 문제는 며칠 전에 c01을 하면서 비슷한 문제가 있어서 그 코드를응용해서 작성했다.(문자열을 while문으로 받아서 길이(n) 체크 → n부터 0까지 출력) 하지만 이상하게 처음에 실행하자 “Bus Error : 10”이라는 에러메시지가 출력되거나, 에러가 안뜨더라도 “abc”를 문자열로 주면 “^@cba”가 출력됐다. 주석처리를 해가며 디버깅을 해봤더니 문제열의 길이를 재는 while문에서 오류가 발생했다. 문자을의 끝을 널문자로 체크하는거였는데 오류가 생기자 그냥 문자열을 ascii코드 상의 문자에 해당되는지 체크하기로 했다.
while (str[i] > 31 && str[i] < 127)
다행히 이렇게 하니 오류 없이 정상적으로 작동해서 success를 받았다.
exam 끝나고 안 사실인데 exam에서는 norminette 체크를 안해도 된다고 한다. 이거 때문에 시간 좀 썼고 2번 문제를 포기했는데 늦게 안 것이 아쉬웠다. 또 내가 오랫동안 씨름한 문자열의 길이체크에서 ‘\0’ 대신 ‘\n’을 썼다는 사실을 알게 됐다. 정확하게 알지 않은 상태에서 시험을 보니 평소 보이던 것 마저 안보이게 된 것 같다.
공부할 부분
-main 함수에서 명령인자를 받는 방법과 그 인자(argc, argv)를 다른함수로 가져와 변수로써 사용하는 방법
-./a.out “example” 일때 argc는 1? 2? →argc는 실행파일까지 카운트 하므로 argv[0]은 실행파일이, argv[1]은 example이 되므로 2.
-문자열을 받아서 반환한 함수의 형태가 왜 char function(str) 형태인지
-Bus Error : 10 의미
-문자열을 받아 끝을 판단할 때 str[i] != ‘\n’이 안된 이유 → null 문자: ‘\0’ 개행 문자: ‘\n’
-문자열을 수정하는 방법 → 인덱스 형태로 초기화하면 됨.
-vim 사용법: 한줄 삭제, 빠르게 이동, 복붙 → esc를 누른 뒤 커서를 위치시키고 dd를 누르면 해당 줄이 지워짐.