2015-11-14 3 views
2

Я пытался создать функцию, которая принимает как строку в качестве аргумента, делит ее на строки, whitch, где слова разделяются пробелами, сохраняются в массиве и возвращаются с помощью указателя. Несмотря на статическое распределение памяти в массиве, был сделан whitch-адрес, сбой программы, из-за ошибки сегментации. Что не так с этим кодом?Объединив строку в массив строк

void separate_words(char* full_text, char *matrix[], int* how_many) 
{ 
char tmp; 
int actual_letter,which_letter=0; 
for(actual_letter=0;actual_letter<strlen(full_text);actual_letter++) 
{ 
    if(full_text[actual_letter]!=32) 
{ 


    full_text[actual_letter]; 
    matrix[*how_many][whitch_letter]=full_text[actual_letter];//here crashes 
} 
else 
{ 
    *how_many++; 
    which_letter=0; 
} 
} 

//*how_many 
} 

/*...*/ 
char words[20][20]; 
char text[20]; 
int number_of_words=0; 
separate_words(text,words,&number_of_words); 
+0

Можете ли вы отправить код, где параметры функции объявлены и инициализированы? – EkcenierK

+0

Возможный дубликат [C - разделительная строка в массив строк] (http://stackoverflow.com/questions/11198604/c-split-string-into-an-array-of-strings) – usr2564301

+0

@KLibby Я не знаю, т. Я положил его на блокнот. – Hassan

ответ

1

Это типичная проблема, когда вы можете использовать strtok

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

void separate_words(char* full_text, char *matrix[], int* how_many) 
{ 
    char *pch; 
    pch = strtok (full_text," \t\n"); 
    int i = 0; 
    while (pch != NULL) 
    { 
     matrix[i++] = pch; 
     pch = strtok (NULL, " \t\n"); 
    } 
    *how_many = i; 
} 

int main() 
{ 
    char str[] = "apple banana orange pineapple"; 
    char *matrix[100] = { NULL }; 
    int how_many = 0; 
    separate_words(str, matrix, &how_many); 

    int i; 
    for(i = 0; i < how_many; i++) 
    { 
     if(matrix[i] != NULL) 
     { 
      printf("matrix[%d] = %s\n", i, matrix[i]); 
     } 
    } 
    return 0; 
} 

Выход:

matrix[0] = apple 
matrix[1] = banana 
matrix[2] = orange 
matrix[3] = pineapple 
0

Часто бывает полезно пройти разделителей использовать с strtok как параметр функции для разделения съел строку в токены. Вы также можете использовать петлю for с strtok, чтобы убрать код при определенных обстоятельствах.

Поскольку количество указателей, назначенных результирующему массиву, никогда не может быть отрицательным, выбор типа данных size_t или unsigned может помочь компилятору указать, будет ли эта переменная позже использоваться неправильно.

И, наконец, при использовании массива указателей статического размера для удержания указателей для каждого токена важно проверить количество назначенных указателей, чтобы предотвратить запись за пределы вашего массива. примечание:, если вы назначаете указатели динамически (с malloc или calloc), вы можете позвонить realloc, когда достигнут ваш начальный лимит, а затем, при необходимости.

Ввод различных частей вместе, альтернатива будет:

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

#define MAXP 100 

void separate_words (char *a[], char *s, char *delim, size_t *n); 

int main (void) 
{ 
    char str[] = "apple banana orange pineapple"; 
    char *delim = " \t\n"; 
    char *matrix[MAXP] = { NULL }; 
    size_t how_many = 0; 
    size_t i; 

    separate_words (matrix, str, delim, &how_many); 

    for (i = 0; i < how_many; i++) 
     printf ("matrix[%zu] = %s\n", i, matrix[i]); 

    return 0; 
} 

/* separate 's' into tokens based on delimiters provided in 'delim' 
* with pointers to each token saved in 'a' with 'n' updated to hold 
* the number of pointers contained in 'a'. 
*/ 
void separate_words (char *a[], char *s, char *delim, size_t *n) 
{ 
    *n = 0; 
    char *p = strtok (s, delim); 
    for (; p; p = strtok (NULL, delim)) { 
     a[(*n)++] = p; 
     if (*n == MAXP) { 
      fprintf (stderr, "warning: pointer limit reached.\n"); 
      return; 
     } 
    } 
} 

Выход

$ ./bin/strtok_static 
matrix[0] = apple 
matrix[1] = banana 
matrix[2] = orange 
matrix[3] = pineapple 

Создание Использование возвратного

Кроме того, вы можете использовать функция возвращает, чтобы вернуть количество токенов в строке. Это устраняет необходимость передавать переменную указателя в качестве параметра функции:

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

#define MAXP 100 

size_t separate_words (char *a[], char *s, char *delim); 

int main (void) 
{ 
    char str[] = "apple banana orange pineapple"; 
    char *delim = " \t\n"; 
    char *matrix[MAXP] = { NULL }; 
    size_t how_many = 0; 
    size_t i; 

    how_many = separate_words (matrix, str, delim); 

    for (i = 0; i < how_many; i++) 
     printf ("matrix[%zu] = %s\n", i, matrix[i]); 

    return 0; 
} 

/* separate 's' into tokens based on delimiters provided in 'delim' 
* with pointers to each token saved in 'a'. The number of tokens is 
* returned. 
*/ 
size_t separate_words (char *a[], char *s, char *delim) 
{ 
    size_t n = 0; 
    char *p = strtok (s, delim); 
    for (; p; p = strtok (NULL, delim)) { 
     a[n++] = p; 
     if (n == MAXP) { 
      fprintf (stderr, "warning: pointer limit reached.\n"); 
      break; 
     } 
    } 
    return n; 
} 
Смежные вопросы