2014-11-04 2 views
0

문자열을 "hacker"[ "h", "ack", "er" ]으로 매핑되는 배열로 매핑해야합니다. 즉, 문자열에서 가장 큰 일련의 인접한 문자 집합을 찾아야합니다.문자열을 토큰에 매핑 할 때 세그먼트 화 오류가 발생하는 이유는 무엇입니까?

제가

  • 문자열을 취하는 함수를 작성해야
  • 문자열
  • 배열 포인터 후자
크기 포인터

,451,515,
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 내가 작동하도록하려는 원본입니다.

+9

입니다. 디버거가 무엇인지 모를지라도, 여전히 'printf' 문을 코드에 넣어서 충돌을 일으키는 정확한 행으로 좁힐 수 있습니다. 왜 그렇게하지 않았습니까? 그리고 질문이 라인과 충돌 할 때 그 라인에서 사용하는 변수의 값으로 업데이트하십시오. – indiv

+1

그래서'gcc -Wall -Wextra -g' (모든 경고와 디버그 정보)로 컴파일하면'gdb' (디버거)를 사용합니다. –

+2

'* tokens [* tokens_length - 1]'은'(* tokens) [* tokens_length - 1]'이어야합니다. 다른 곳에서도 그 오류가 있습니다. 코드를 좀 더 읽기 쉽도록 만들기 위해서는'* 토큰 (token) '에서 초기화하는 로컬'char **'을 사용하는 것이 좋습니다. 그리고 함수의 끝에서 값을'* 토큰 '으로 복사하십시오. –

답변

0

catch! :) 적어도 세분화 오류가 발생하지 않았습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

size_t tokenize(const char *s, char ***tokens) 
{ 
    size_t n = 0; 
    const char *p; 

    *tokens = NULL; 

    p = s; 
    while (*p) 
    { 
     for (const char *q = p; !(*++p < *q); ++q); 
     ++n; 
    } 

    if (n != 0) 
    { 
     size_t i = 0; 

     *tokens = (char **)malloc(n * sizeof(char *)); 

     p = s; 
     do 
     { 
      const char *q = p++; 

      while (!(*p < *(p - 1))) ++p; 

      (*tokens)[i] = malloc(p - q + 1); 
      strncpy((*tokens)[i], q, p - q); 
      (*tokens)[i][p-q] = '\0'; 

      ++i; 
     } while (*p); 
    } 

    return n; 
} 

int main(void) 
{ 
    char s[] = "hacker"; 
    char **tokens; 
    size_t n; 

    n = tokenize(s, &tokens); 

    printf("[ "); 
    for (size_t i = 0; i < n; i++) 
    { 
     printf("\"%s\", ", tokens[i]); 
    } 
    printf("]\n"); 

    free(tokens); 

    return 0; 
} 

프로그램 출력이이 문제를 오늘 게시 된 백 "내 세그먼트 오류 디버그"처럼 다음

[ "h", "ack", "er", ] 
관련 문제