게시판

검색 결과: 15

 

UNIT 6을 참조해서 count++ 부분에 중단점을 설정하고 디버깅 모드로 실행해보면 count++이 한 번도 실행되지 않습니다.

문법 오류는 없지만, 코드의 로직이 틀렸습니다.

UNIT 45.1의 예제를 보면 문자열을 단어로 자르기 위해 공백을 사용했고, 문의한 코드에서는 공백은 구분자로 지정하지 않았습니다. ".,"만 지정했으니까 구분자는 . 또는 , 이라는 것이죠.

따라서 코드는 작성자가 작성한 로직대로 충실하게 동작한 것이고, 공백을 기준으로 단어를 나누지 않으니 count++이 한 번도 실행되지 않는 것입니다.


, 도장_ 관리자님이 작성
 
UNIT 45.1을 보면 그림 45-3이 있습니다.
strtok 함수가 끝까지 동작하면 ptr이 NULL이 되고 반복문을 끝내게 됩니다.
따라서 NULL 체크는 끝이 아닌지 확인하기 위해 필요합니다.

어떤 방법으로 문제를 해결해도 됩니다. 풀이는 여러 가지가 있을 수 있습니다.

 

strchr 함수는 문자열에서 문자를 찾는 것이므로 함수에 인자가 char 문자로 되어 있습니다.

strtok 함수는 구분자로 사용할 문자열을 입력 받기 때문에 인자가 char* 문자열로 되어 있습니다. 구분자로 사용할 문자가 공백 하나면 " "로 지정하지만, 구분자로 사용할 문자가 콤마(,)와 " " 두 가지면 ", "으로 지정합니다.

두 함수의 용법이 다르고, 인자가 다릅니다.

내용을 다시 학습하고, 진도를 나가면서 심사문제를 풀어보면 자연히 이해되는 부분이 있을 겁니다.


, 이 정민님이 작성
 

44.7의 심사문제에서 strchr 을 사용해 공백을 찾을 때는 ' ' 이렇게 표현하였는데 strtok의 경우 공백을 표현할때 ' '은 안되고 " "이렇게 표현한다고 되어있습니다. 어떨 때는 ' '를 사용하고 어떨땐 " "이렇게 공백을 표현하는 이유가 무엇인가요? 

strchr은 문자고 strtok는 문자열이라 그런것인가요?

궁금해서 질문드립니다.

, 도장_ 관리자님이 작성
 
strtok 함수는 많은 사람이 어려워합니다. 이미 많은 질문이 있습니다.
포럼 상단에 strtok로 검색하면 이전 답변을 볼 수 있습니다.

strtol 함수에 대해서는 Unit 46.2 처음에 함수의 원형이 쓰여 있습니다.


    strtol(문자열, 끝포인터, 진법);
    long strtol(char const *_String, char **_EndPtr, int _Radix);
    성공하면 변환된 정수를 반환, 실패하면 0을 반환

 첫 번째 인수는 char const *입니다. 간단히 char *이지만, 함수 내부에서 값이 변경되면 안 되니까 const로 지정합니다.
두 번째 인수는 변환이 끝난 문자열의 위치를 가리키는 포인터로 char** _EndPtr입니다.
문자열을 char *로 받았고, 변환이 끝난 위치를 가리키는 포인터가 필요하니까 char**입니다.

char를 가리킬 필요가 있다 -> char*로 가리킨다.

영어로는 char*이 pointer to char입니다.

char*를 가리킬 필요가 있다 -> char**로 가리킨다.

영어로는 char**이 pointer to char*입니다.

그러나 char*를 가리킬 때 주소만 필요하다면 & 주소 연산자를 붙여서

address of char*로 전달해도 됩니다. address와 pointer는 호환되니까요.


strtol 함수는 문자열 하나를 숫자 하나로 변환하는 함수가 아닙니다.

문자열에 있는 여러 숫자를 모두 숫자로 변환할 수 있는 함수입니다.

따라서 다음 호출에는 다음 위치를 전달하면 됩니다.

이에 대한 설명은 그림 46-1과 그 아래 string_to_long_multiple_integers.c에 설명되어 있습니다.


, 박 태훈님이 작성
 

질문 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개를 누락해서 카운팅하고 있습니다.



 
포럼 상단에 45.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로 채우고 자른 문자열 만큼 다음 문자로 이동한다는 코드는 어떤 부분에서 나온건지 이해가 안됩니다 .