문자열을 완전히 동적으로 할당 된 문자열 배열로 분할

Tix'at

이 질문은 이 주제에 정말 가깝지만 이 솔루션에서 제공해야하는 책임과 포인터 설명을 선호합니다.

그래서 나는 데이터 파일을 가지고 있고 그것으로부터 매우 긴 char 배열을 얻습니다. 이 문자열을 각 경우에이 파일의 한 줄에 해당하는 문자열을 사용하여 배열로 나누고 싶습니다.
해결책을 보았지만 모두 제한된 배열을 사용합니다. 각 줄의 길이를 모르기 때문에 모든 줄을 동적으로 할당해야하지만 strtoknull 문자를 넣지 않기 때문에 줄의 길이를 찾을 수 없습니다. \0각 문자열의 끝에.

지금 내가 가진 것은이 두 가지 솔루션이지만 둘 다 작동하지 않습니다.

int get_lines(char *file, char **lines) {
    int nb_lines = 0;
    char *token = strtok(file, "\n");
    for(int i = 0; token != NULL; i++) {
        token = strtok(NULL, "\n");
        nb_lines = i;
    }
    nb_lines++;

    lines = malloc((nb_lines + 1) * sizeof(char*));
    lines[nb_lines] = '\0';

    token = strtok(file, "\n");
    for(int i = 0; token != NULL; i++) {
        token = strtok(NULL, "\n");
        int nb_char = 0;
        for(int j = 0; token[j] != '\n'; j++) //This will cause SIGSEGV because strtok don't keep the '\n' at the end
            nb_char = j;
        nb_char++;
        token[nb_char] = '\0'; //This cause SIGSEGV because token's allocation finish at [nb_char-1]
        lines[i] = malloc(strlen(token) * sizeof(char)); //strlen cause SIGSEGV because I cannot place the '\0' at the end of token
        printf("%s", token); //SIGSEGV because printf don't find the '\0'
        lines[i] = token;
    }

    for(int i = 0; i < nb_lines; i++) {
        printf("%s", lines[i]); //SIGSEGV
    }

    return nb_lines;
}

그래서 당신은 내가 무엇을하고 싶은지 그리고 왜 그것이 작동하지 않는지에 대한 아이디어를 위에서 볼 수 있습니다.

아래에서 내가 만든 다른 시도를 볼 수 있지만 같은 지점에 갇혀 있습니다.

int count_subtrings(char* string, char* separator) {
    int nb_lines = 0;
    char *token = strtok(string, separator);
    for(int i = 0; token != NULL; i++) {
        token = strtok(NULL, separator);
        nb_lines = i;
    }
    return nb_lines + 1;
}

char** split_string(char* string, char* separator) {
    char **sub_strings = malloc((count_subtrings(string, separator) + 1) * sizeof(char*));
    for(int i = 0; string[i] != EOF; i++) {
        //How to get the string[i] lenght to malloc them ?
    }
}

내 파일이 상당히 크고 줄이 너무 클 (strlen(file) + 1) * sizeof(char)수 있으므로 각 줄이 SIGSEGV가 아닌지 확인하기 위해 크기가 다른 다른 테이블을 malloc하고 싶지 않으며 다른 사람이 있다면이 솔루션이 매우 더럽습니다. 생각하면 정말 행복 할 것입니다.

(영어 실수로 미안 해요, 정말 잘 못해요)

M Oehm

접근 방식 strtok에는 두 가지 단점이 있습니다. 첫째, strtok문자열을 수정하므로 원래 문자열을 한 번만 전달할 수 있습니다. 둘째, 그것은 하나의 토큰 분리 자로 nelines의 뻗어나 가기 때문에 빈 줄을 건너 뜁니다 .. (나는 그것이 당신에게 관심사인지 모르겠습니다.)

문자열을 한 번 통과하여 줄 바꿈을 계산할 수 있습니다. 라인 배열에 메모리를 할당하고 두 번째 패스를 만듭니다. 여기서 문자열을 줄 바꿈으로 분할합니다.

char **splitlines(char *msg)
{
    char **line;
    char *prev = msg;
    char *p = msg;

    size_t count = 0;
    size_t n;

    while (*p) {
        if (*p== '\n') count++;
        p++;
    }

    line = malloc((count + 2) * sizeof(*line));
    if (line == NULL) return NULL;

    p = msg;
    n = 0;
    while (*p) {
        if (*p == '\n') {
            line[n++] = prev;
            *p = '\0';
            prev = p + 1;
        }

        p++;
    }

    if (*prev) line[n++] = prev;
    line[n++] = NULL;

    return line;
}

줄 바꿈 개수보다 두 개의 줄 포인터를 더 할당했습니다. 하나는 마지막 줄이 줄 바꿈으로 끝나지 않는 경우를위한 것이고 다른 하나 NULL는 끝에 센티넬 을 배치하여 배열이 끝나는 위치를 알 수 있습니다. (물론에 대한 포인터를 통해 실제 줄 수를 반환 할 수 size_t있습니다.)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C에서 동적으로 할당 된 문자열 배열

분류에서Dev

동적으로 할당 된 배열에 문자열 쓰기

분류에서Dev

콜론으로 구분 된 문자열을 배열로 분할

분류에서Dev

문자열 값을 입력으로 분할 된 배열로

분류에서Dev

파일에서 동적으로 할당 된 2D 문자열 배열

분류에서Dev

문자열 배열을 동적으로 할당

분류에서Dev

동적으로 할당 된 배열에 문자열을 입력하려고 할 때 오류 발생

분류에서Dev

문자열을 Object 배열로 분할

분류에서Dev

문자열을 배열로 분할 C #

분류에서Dev

PHP 문자열을 배열로 분할

분류에서Dev

\ r \ n으로 구분 된 문자열을 문자열 배열로 분할 [C / C ++]

분류에서Dev

C에서 동적으로 할당 된 2D 문자 배열을 채우는 동안 이상한 동작

분류에서Dev

문자열을 문자열 배열로 분할

분류에서Dev

문자열을 문자열 배열로 분할

분류에서Dev

쉼표로 구분 된 문자열을 부울 열로 분할

분류에서Dev

C ++ 문자열을 다른 문자열 전체로 분할

분류에서Dev

분할 된 문자열을 기반으로하는 중첩 배열

분류에서Dev

2 개의 배열로 분할 된 문자열

분류에서Dev

C ++에서 동적으로 할당 된 문자 배열을 참조하는 방법

분류에서Dev

Java : 문자열 길이별로 정렬 된 문자열 배열을 문자열 길이별로 여러 배열로 분할

분류에서Dev

C ++에서 문자열 배열로 선언 및 할당 분할

분류에서Dev

구분 된 문자열 "# | #"로 문자열을 분할하는 방법

분류에서Dev

PHP 배열 값을 쉼표로 구분 된 문자열로 할당하는 방법

분류에서Dev

DataFrame의 문자열 배열을 자체 열로 분할

분류에서Dev

문자열을 문자로 분할

분류에서Dev

Oracle에서 구분 된 문자열을 행으로 분할

분류에서Dev

VB.net에서 문자열을 입력 된 길이 문자열 배열로 분할하는 방법

분류에서Dev

배열의 문자열을 더 많은 배열로 분할

분류에서Dev

동적으로 할당 된 배열을 포함하는 구조체 배열을 동적으로 할당

Related 관련 기사

  1. 1

    C에서 동적으로 할당 된 문자열 배열

  2. 2

    동적으로 할당 된 배열에 문자열 쓰기

  3. 3

    콜론으로 구분 된 문자열을 배열로 분할

  4. 4

    문자열 값을 입력으로 분할 된 배열로

  5. 5

    파일에서 동적으로 할당 된 2D 문자열 배열

  6. 6

    문자열 배열을 동적으로 할당

  7. 7

    동적으로 할당 된 배열에 문자열을 입력하려고 할 때 오류 발생

  8. 8

    문자열을 Object 배열로 분할

  9. 9

    문자열을 배열로 분할 C #

  10. 10

    PHP 문자열을 배열로 분할

  11. 11

    \ r \ n으로 구분 된 문자열을 문자열 배열로 분할 [C / C ++]

  12. 12

    C에서 동적으로 할당 된 2D 문자 배열을 채우는 동안 이상한 동작

  13. 13

    문자열을 문자열 배열로 분할

  14. 14

    문자열을 문자열 배열로 분할

  15. 15

    쉼표로 구분 된 문자열을 부울 열로 분할

  16. 16

    C ++ 문자열을 다른 문자열 전체로 분할

  17. 17

    분할 된 문자열을 기반으로하는 중첩 배열

  18. 18

    2 개의 배열로 분할 된 문자열

  19. 19

    C ++에서 동적으로 할당 된 문자 배열을 참조하는 방법

  20. 20

    Java : 문자열 길이별로 정렬 된 문자열 배열을 문자열 길이별로 여러 배열로 분할

  21. 21

    C ++에서 문자열 배열로 선언 및 할당 분할

  22. 22

    구분 된 문자열 "# | #"로 문자열을 분할하는 방법

  23. 23

    PHP 배열 값을 쉼표로 구분 된 문자열로 할당하는 방법

  24. 24

    DataFrame의 문자열 배열을 자체 열로 분할

  25. 25

    문자열을 문자로 분할

  26. 26

    Oracle에서 구분 된 문자열을 행으로 분할

  27. 27

    VB.net에서 문자열을 입력 된 길이 문자열 배열로 분할하는 방법

  28. 28

    배열의 문자열을 더 많은 배열로 분할

  29. 29

    동적으로 할당 된 배열을 포함하는 구조체 배열을 동적으로 할당

뜨겁다태그

보관