durams
@durams
수강평 작성수
-
평균평점
-
게시글
질문&답변
cstr직접구현
안녕하세요? 질문&답변 도우미 durams입니다.StrCpy_s복사 이후 destination 문자열의 끝에 널 문자를 추가하는 코드가 누락되어 있습니다.StrCat_s이곳에도 concat 이후 destination의 끝에 널 문자를 추가하는 코드가 없습니다. StrCmpC 표준 라이브러리의 strcmp는 두 문자열을 사전순(lexicographical)으로 비교해서 첫 번째 문자열이 사전순으로 앞에 위치하는 경우 음수를, 두 번째 문자열이 사전순으로 앞에 위치하는 경우 양수를, 그리고 동일하면 0을 반환합니다. 강의에서의 설명인 '같으면 0, 다르면 -1'은 어느정도 간소화된 설명이라고 볼 수 있습니다.그런데 질문자님의 코드는 강의에서 설명하는 것과 실제 C 라이브러리 둘 모두와 다른 것으로 보입니다. 어떤 조건이 있을 때 어떻게 반환해야 할 지 한 번 정리해보시는 것을 추천드립니다.코드만 제시하시고 별다른 말씀이 없으셔서 정확히 어떤 피드백을 요구하시는지 답변해드리기 어려운 느낌이 있습니다. 제가 모두 다 알려드리기에는 질문자님이 수동적으로 공부를 하실 것이 염려되기 때문에, 강의 자체에 대해 어느정도 이해가 되었다고 판단이 되시면 스스로 고민하고 디버깅해보는 시간을 갖는 것이 무척이나 도움이 될 것이라고 확신합니다. 이와 별개로 강의 내용 중 잘 이해가 가지 않는 부분이나 궁금한 내용 등에 대한 질문은 언제나 환영입니다. 또한, 코드를 첨부하시는 경우 이미지보다는 코드 블록 기능을 활용하시면 더 시인성 좋은 글쓰기가 가능하니 다음에 활용해보세요.
- 0
- 3
- 30
질문&답변
11.7 함수를 구현해 봤습니다.
안녕하세요? 질문&답변 도우미 durams입니다.min_index는 바깥 for 루프에서 0으로 초기화해주고 있는데요, min_index는 안쪽 for 루프에서 매번 초기화되어야합니다. 반례로 {1, 5, 10}와 같은 경우가 있습니다.여러 질문을 연속적으로 달아주셨는데요, 질문 본문에 어떤 것이 궁금하신지에 대해 따로 말씀이 없으시면 질문자님의 의중을 파악하기 어려우니 궁금하신 주제, 또는 강의 중 이해가 가지 않았던 내용 등을 상세히 작성해주신다면 더 풍부한 답변을 제공해드릴 수 있습니다. 또한 작성하신 코드에 대해 테스트와 디버깅을 생활화하시는 것도 추천드립니다.
- 1
- 2
- 26
질문&답변
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
안녕하세요? 질문&답변 도우미 durams입니다.my_strcmp두 문자열의 길이를 먼저 비교하고 길이가 같을 때에만 반복문을 통해 비교하도록 구현하셨는데요, 이는 사실 strcmp의 동작과는 조금 다릅니다. strcmp는 순수하게 사전순(Lexicographical)으로 비교를 하기 때문에, 길이가 다르다고 해서 바로 결정이 나지는 않습니다. 한 글자씩 비교하다가 한 쪽에 널 문자가 등장하는 경우 널 문자는 값이 0이기 때문에 자동으로 사전순으로 맨 앞에 위치하는 것이 되는 식으로 비교가 이루어지죠. 물론 널 문자를 만나면 종료도 이루어져야 합니다.또한 반환값을 결정하는 로직이 혼재되어있는 것 같습니다. C 표준 함수 strcmp는 첫 번째 문자열이 사전순으로 빠르다면 음수(-1)을, 두 번째 문자열이 사전순으로 빠르다면 양수(1)을 반환합니다. 하지만 반복문을 통해 비교하는 부분에서는 그와 반대로 반환하는 것으로 보입니다.my_strncmp인자로 전달받은 문자열을 복사한 다음 길이를 맞추고 비교를 하는 것을 보이는데요, 여기도 오류가 있습니다. sizeof() 연산자가 받는 str1과 str2는 배열이 아닌 포인터이기 때문에, 문자열의 길이와 관계없이 x86으로 빌드했다면 4, x64로 빌드했다면 8을 반환하게 됩니다. 실제 문자열의 길이를 얻고 싶다면 strlen을 사용하거나 다른 방법을 사용하셔야 합니다.또한 복사나 fit_str을 하는 전처리를 할 필요없이 바로 비교를 할 수도 있습니다. 물론 str1과 str2가 loc보다 작은 경우를 판별하는 등의 예외 처리는 필요합니다.
- 1
- 2
- 22
질문&답변
11.6 my_strcat과 my_strncat을 구현해봤습니다.
안녕하세요? 질문&답변 도우미 durams입니다.잘 작성해주셨네요. 다만 잠재적으로 위험한 부분이 두 가지 있습니다.완성된 문자열의 끝에 널 문자를 붙여주는 코드가 없기 때문에, 이 문자열을 다른 C스타일 문자열 처리 함수에 인자로 전달한다면 널 문자를 찾지 못해 예상한 대로 동작하지 않을 수 있습니다.아직 동적 메모리 할당과 관련 내용에 대해 배우지 않으셨으니 짧게만 어떤 문제점이 있을 수 있는지 알려드릴게요.현재 코드에서는 str1의 시작 주소와 str1의 길이를 활용하여 str1이 끝나는 위치부터 str2를 붙이고 있습니다. 하지만 이런 동작이 안전하게 수행되려면 str1이 끝나는 위치 이후 삽입될 문자열의 크기만큼 여유 공간이 있어야 하겠죠. (my_strcat의 경우 strlen(str2) 만큼, my_strncat의 경우 loc 만큼) 하지만 현재 코드에서는 그런 동작을 보장하지 않습니다.직접 문자열을 전달해서 테스트해보셔도 좋구요, 일단은 그렇구나 하고 넘어가시고 동적 메모리 할당 관련 내용을 배우고 난 후 다시 구현해보셔도 좋습니다.다른 방법으로는 '해당 배열에 대해 허용된 크기'를 함수에 전달하여 처리하셔도 됩니다.
- 1
- 2
- 24
질문&답변
11.6 fit_str함수를 구현해 봤습니다.
안녕하세요? 질문&답변 도우미 durams입니다.이번 강의에서 언급된 주의점인 '메모리 유효성 확인하기'가 수행되지 않고 있습니다. loc이 유효한 인덱스를 가리키는지 확인하는 과정이 없습니다.작성하신 for 문은 혹시 널 문자로 지정한 loc 인덱스 이후의 문자들을 널 문자로 만든다는 의미가 맞을까요? strlen 함수는 널 문자를 기반으로 문자열의 끝과 길이를 판단하기 때문에, loc 이후의 문자를 널 문자로 채운다는 동작은 예상한 대로 동작하지 않습니다. 해당 for 문은 실행되지 않게 됩니다.puts로 출력하는 동작 역시 널 문자 이전까지의 문자만을 출력하기 때문에, loc 이후의 문자가 수정되었는지는 확인할 수 없습니다.
- 1
- 2
- 21
질문&답변
BubbleSort
안녕하세요? 질문&답변 도우미 durams입니다.바깥쪽 for문에서 조건을 i 로 작성하면 반복문의 횟수를 한 번 줄일 수 있겠네요. 마지막 원소는 그 자체로 정렬되어있기 때문입니다.
- 1
- 2
- 21
질문&답변
11.5 코드 구현
안녕하세요? 질문&답변 도우미 durams입니다.잘 작성해주셨는데요, 몇 가지 개선할 수 있는 점이 보이네요.custom_putputchar의 반환값이 0인지 아닌지를 판별해서 인덱스 변수 i를 증가시키고 있기 때문에 '일단 출력을 시도하고' 반환값으로 뒤늦게 확인하는 형태입니다. 널 문자도 출력하려고 시도하게 되죠. putchar를 비롯한 대부분의 입출력 함수들은 널 문자를 만나면 작동을 멈추긴 하지만, 널 문자를 출력하려고 시도하는 것은 일반적이지 않습니다. putchar를 호출하기 전 *(str + i)가 무엇인지 확인하도록 수정하면 좋을 것 같습니다.custom_put2앞에서 말씀드린 것과 동일한 문제가 있지만, 이외에는 잘 작성하셨습니다.putchar은 EOF를 만나거나 에러가 발생했을 때 반환값으로 EOF를 반환하기 때문에, putchar의 반환값을 그대로 '읽은 문자'로 활용하기에는 부적절한 면이 있습니다.
- 1
- 2
- 23
질문&답변
C언어 엔터
안녕하세요? 질문&답변 도우미 durams입니다.네, 문제없습니다. 하나의 문자열 리터럴로 취급됩니다.
- 1
- 2
- 29
질문&답변
포인터와 변수
안녕하세요? 질문&답변 도우미 durams입니다.포인터 변수는 어떠한 메모리 주소를 담는 변수로, 포인터 변수의 타입은 해당 주소에 위치한 값을 어떤 타입에 기반하여 해석할 것인지를 나타냅니다. 가령 int* 타입의 변수는 가리키는 주소에 위치한 값을 int로 해석할 것임을 의미합니다. 즉, int 변수가 있다면 int*로 가리켜야 올바르게 주소가 가리키는 값을 해석할 수 있습니다. 이는 타입 별로 차지하는 크기와 해석하는 방식이 달라지기 때문에 중요합니다.
- 1
- 2
- 34
질문&답변
질문있습니다.
안녕하세요? 질문&답변 도우미 durams입니다.네, 그렇습니다. 다만 '실행 순서'와 '컴파일러 또는 링커가 읽고 이해하는 순서'는 다를 수 있습니다. 문제는 각각에서 발생할 수 있습니다.
- 1
- 2
- 34




