0
문자열을 "hacker"
이 [ "h", "ack", "er" ]
으로 매핑되는 배열로 매핑해야합니다. 즉, 문자열에서 가장 큰 일련의 인접한 문자 집합을 찾아야합니다.문자열을 토큰에 매핑 할 때 세그먼트 화 오류가 발생하는 이유는 무엇입니까?
제가
- 문자열을 취하는 함수를 작성해야
- 문자열
- 배열 포인터 후자
f("hacker") = ([ "h", "ack", "er"], 3)
일반적인 호출이 기능의 사용은 ... 여기에 내가
void tokenize (const char *s, char ***tokens, size_t *tokens_length) {
char *current_ptr = NULL;
char *previous_ptr = NULL;
size_t characters_read = 0;
current_ptr = previous_ptr = s;
for (; current_ptr < s + strlen(s);) {
characters_read = characters_read + 1;
if (*(current_ptr + 1) < *current_ptr) {
*tokens_length = *tokens_length + 1;
*tokens = (char**)realloc((void*)*tokens, *tokens_length * sizeof(char*));
*tokens[*tokens_length - 1] = (char*)calloc(characters_read + 1, sizeof(char));
strncpy(*tokens[*tokens_length - 1], previous_ptr, characters_read * sizeof(char));
previous_ptr = current_ptr + 1;
characters_read = 0;
}
current_ptr = current_ptr + 1;
}
}
을 쓴 함수의 본문입니다 그리고 여기에 일반적인 출력의
char **tokens = NULL;
size_t tokens_length = 0;
tokenize("hacker", &tokens, &tokens_size)
printf("[ ");
for (int i = 0; i < tokens_length; i++) {
printf("\"%s\", " tokens[i]);
}
printf("]");
것
[1] 4789 segmentation fault (core dumped)
당신이 내가 왜 그걸 관리하지 못하고 있는지에 대한 단서가 있습니까? 기억?
Here 내가 작동하도록하려는 원본입니다.
입니다. 디버거가 무엇인지 모를지라도, 여전히 'printf' 문을 코드에 넣어서 충돌을 일으키는 정확한 행으로 좁힐 수 있습니다. 왜 그렇게하지 않았습니까? 그리고 질문이 라인과 충돌 할 때 그 라인에서 사용하는 변수의 값으로 업데이트하십시오. – indiv
그래서'gcc -Wall -Wextra -g' (모든 경고와 디버그 정보)로 컴파일하면'gdb' (디버거)를 사용합니다. –
'* tokens [* tokens_length - 1]'은'(* tokens) [* tokens_length - 1]'이어야합니다. 다른 곳에서도 그 오류가 있습니다. 코드를 좀 더 읽기 쉽도록 만들기 위해서는'* 토큰 (token) '에서 초기화하는 로컬'char **'을 사용하는 것이 좋습니다. 그리고 함수의 끝에서 값을'* 토큰 '으로 복사하십시오. –