2013-06-10 15 views
0

Я пытаюсь преобразовать Char* в Char**.Преобразование Char * в массив Char *

например. "echo Hello World" станет {"echo", "Hello", "World"}

Я знаю, что могу получить единственные слова от Char* с strtok().

Но у меня возникли проблемы с инициализацией Char**, так как Char* имеет неизвестный размер, а отдельные слова также имеют нестандартный размер.

+0

я предполагаю, вы имеете в виду «символ», а не «Чар». Символ ** должен быть в виде массива указателей, каждый из которых указывает на одну из строк. Другими словами char ** wordlist = malloc (sizeof (char *) * iWordCount) –

+0

Хм, мне нужно создать копию char *, чтобы сначала подсчитать слова, а затем вставить их, сделайте? –

ответ

0

Ваш char** - это всего лишь указатель на первый char * (или начало массива указателей на символы). Выделение char*[] (это не то же, что и char** !!) может быть большой проблемой. Для выполнения этой задачи вы должны использовать malloc. Если вы не знаете число char* s заранее, вы можете просто угадать некоторый размер, заполнить его NULL s и позвонить по телефону realloc при необходимости.

0

Вы можете запустить свою строку и выполнить поиск '' (пробел), а затем каждое найденное вами пространство вы можете получить подстроку с помощью функции strncpy, чтобы получить строку между текущим индексом пространства и последним индексом пробела. Каждая создаваемая вами строка может храниться в «динамическом» массиве (с malloc и realloc).
Для первой подстроки ваш начальный индекс равен 0, а в конце строки вы получаете последнюю подстроку между последним индексом пространства и длиной строки.

0

Первый результат в Google search дает пример того, что вы могли бы изменить:

/* strtok example */ 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h>   

int main() 
{ 
    // allocate 10 strings at a time 
    int size = 10; 
    int i = 0; 
    char str[] ="echo Hello World"; 
    char** strings = malloc(size * sizeof(char*)); 
    char* temp; 

    printf ("Splitting string \"%s\" into tokens:\n",str); 
    temp = strtok (str," "); 
    while (temp != NULL) 
    { 
    strings[i++] = temp; 
    temp = strtok (NULL, " ,.-"); 
    if(i % size == 0) 
     //allocate room for 10 more strings 
     strings = realloc(strings, (i+size) * sizeof(char*)); 
    } 

    int j; 
    for(j = 0; j < i; j ++) 
    { 
     printf ("%s\n",strings[j]); 
    } 
    return 0; 
} 
+0

strtok() является разумной рекомендацией, но должен сопровождаться предупреждением о том, что он изменяет исходную строку. –

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

size_t word_count(const char *str){ 
    enum { out, in } status; 
    size_t count = 0; 
    status = out; 
    while(*str){ 
     if(isspace(*str++)){ 
      status = out; 
     } else if(status == out){ 
      status = in; 
      ++count; 
     } 
    } 
    return count; 
} 

int main(void){ 
    char original[] = "echo Hello World"; 
    size_t i, size = word_count(original); 
    char *p, **words = (char**)malloc(sizeof(char*)*size); 

    for(i = 0, p = original;NULL!=(p=strtok(p, " \t\n")); p = NULL) 
     words[i++] = p; 
    //check print 
    printf("{ "); 
    for(i = 0;i<size;++i){ 
     printf("\"%s\"", words[i]); 
     if(i < size - 1) 
      printf(", "); 
    } 
    printf(" }\n"); 

    return 0; 
} 
Смежные вопросы