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를 누르면 해당 줄이 지워짐.