게시판
검색 결과: 15
UNIT 6을 참조해서 count++ 부분에 중단점을 설정하고 디버깅 모드로 실행해보면 count++이 한 번도 실행되지 않습니다.
문법 오류는 없지만, 코드의 로직이 틀렸습니다.
UNIT 45.1의 예제를 보면 문자열을 단어로 자르기 위해 공백을 사용했고, 문의한 코드에서는 공백은 구분자로 지정하지 않았습니다. ".,"만 지정했으니까 구분자는 . 또는 , 이라는 것이죠.
따라서 코드는 작성자가 작성한 로직대로 충실하게 동작한 것이고, 공백을 기준으로 단어를 나누지 않으니 count++이 한 번도 실행되지 않는 것입니다.
strchr 함수는 문자열에서 문자를 찾는 것이므로 함수에 인자가 char 문자로 되어 있습니다.
strtok 함수는 구분자로 사용할 문자열을 입력 받기 때문에 인자가 char* 문자열로 되어 있습니다. 구분자로 사용할 문자가 공백 하나면 " "로 지정하지만, 구분자로 사용할 문자가 콤마(,)와 " " 두 가지면 ", "으로 지정합니다.
두 함수의 용법이 다르고, 인자가 다릅니다.
내용을 다시 학습하고, 진도를 나가면서 심사문제를 풀어보면 자연히 이해되는 부분이 있을 겁니다.
44.7의 심사문제에서 strchr 을 사용해 공백을 찾을 때는 ' ' 이렇게 표현하였는데 strtok의 경우 공백을 표현할때 ' '은 안되고 " "이렇게 표현한다고 되어있습니다. 어떨 때는 ' '를 사용하고 어떨땐 " "이렇게 공백을 표현하는 이유가 무엇인가요?
strchr은 문자고 strtok는 문자열이라 그런것인가요?
궁금해서 질문드립니다.
strtol(문자열, 끝포인터, 진법);
long strtol(char const *_String, char **_EndPtr, int _Radix);
성공하면 변환된 정수를 반환, 실패하면 0을 반환
질문 1. UNIT 45.1에서
char *ptr = strtok(s1, " "); // " " 공백 문자를 기준으로 문자열을 자름, 포인터 반환 while (ptr != NULL) // 자른 문자열이 나오지 않을 때까지 반복 { printf("%s\n", ptr); // 자른 문자열 출력 ptr = strtok(NULL, " "); // 다음 문자열을 잘라서 포인터를 반환 }한다고 돼 있는데 첫부분에
char *ptr = strtok(s1, " ");여기서 시작점을 s1이라는 특정 주소를 가리키는건 이해가 가는데
ptr = strtok(NULL, " ");여기서 시작점을 NULL이라고 하는건 잘 이해가 안됩니다.
문자열을 자를 시작점을 지정해주는건데 특정 주소가 아닌
NULL은 그냥 공백을 의미하는거잖아요. 어떻게 처음 잘랐던
문자열의 끝부분이라는게 성립이 되는건가요?
--------------------------------------------------------------------------------------------
질문 2. UNIT 46.2
num1 = strtol(s1, &end, 16); // 16진법으로 표기된 문자열을 정수로 변환 num2 = strtol(end, &end, 10); // 10진법으로 표기된 문자열을 정수로 변환 num3 = strtol(end, &end, 16); // 16진법으로 표기된 문자열을 정수로 변환 num4 = strtol(end, NULL, 10);에서 strtol 안에 들어가는 두번째 인자가 왜 end가 아닌 &end인지
이해가 안됩니다. end가 포인터이면 그냥 end에 주소값을 넣으면
되는거 아닌가요?
일단 틀린 점은...
#define CRT_SECURE_NO_WARNINGS
->
#define _CRT_SECURE_NO_WARNINGS
#define 지시문은 #include보다 앞에 와야 합니다. 선언 순서를 수정하지 않으면 Visual Studio에서는 컴파일이 되지 않습니다. strtok 함수를 에러로 처리합니다. strtok 함수는 C 언어 표준 함수이므로 다른 플랫폼, 다른 컴파일러 구현체에서는 문제없이 사용할 수 있습니다.
문의한 코드에 중단점을 설정하고 F5 키로 디버깅을 시작합니다. 심사문제의 테스트 케이스를 입력합니다.
19번 줄에서 strtok 함수를 실행했기 때문에 이미 ptr에 값 "the"가 들어간 것을 아래에 창에서 확인할 수 있습니다.
UNIT 6의 디버깅 강의를 참고하셔서 디버거를 익히면 프로그램이 동작하는 과정을 확인하면서 문제점을 찾을 수 있습니다.
UNIT 45.1의 예제를 보면 strtok를 한 번 호출하고, while 루프 안에서 strtok를 반복해서 호출하는 것을 알 수 있습니다. 이 동작 과정은 그림 45-1부터 45-4까지 설명되어 있습니다. 조금 복잡한 과정을 거칩니다.
심사문제에서는 문자열을 나누는 것이 목적이 아니라 예시 텍스트에 "the" 문자열이 몇 개나 있는지 확인하는 문제이므로 count 변수를 이용해 정확하게 개수를 세는 게 중요합니다.
포럼 상단에 유닛 번호 45.8로 검색하면 이전 질문과 답변을 찾아볼 수 있습니다.
"== 0"이 필요한 이유. Unit 41.2를 보면 strcmp 함수는 두 문자열이 같을 때 0을 반환합니다. 예제에서는 ret 변수에 strcmp 함수의 결과를 저장했지만, 심사문제 해설에서는 불필요한 변수를 쓰지 않고 직접 비교를 한 것으로 보입니다.
문제에서는 "the"의 개수를 찾아야 합니다. 테스트 케이스의 정답은 6이고, 문의한 코드는 5를 제출합니다. 항상 1개를 누락해서 카운팅하고 있습니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(void)
{
char s1[30] = "The Little Prince";
char *ptr = strtok(s1, " ");
while (ptr != NULL)
{
printf("%s\n", ptr);
ptr = strtok(NULL, " ");
}
return 0;
}
에서 ptr = strtok(NULL, " "); 부분이 이해가 안가는데
strtok 함수는 (대상문자열, 기준문자)같이 사용한다고 하셨는데
NULL이 어떻게 대상문자열이 되고 공백 부분을 NULL로 채우고 자른 문자열 만큼 다음 문자로 이동한다는 코드는 어떤 부분에서 나온건지 이해가 안됩니다 .
이전 답변을 참고하세요.
https://dojang.io/mod/forum/discuss.php?d=186&parent=447
또한, 상단 포럼 검색에서 45.1을 검색하면 더 많은 이전 문의와 답변을 볼 수 있습니다.