2012-06-19 5 views
1

Хорошо, так что у меня есть следующий код:Двойной указатель на символ []

char** args = (char**)malloc(10*sizeof(char*)); 
memset(args, 0, sizeof(char*)*10); 

char* curToken = strtok(string, ";"); 

for (int z = 0; curToken != NULL; z++) { 
    args[z] = strdup(curToken); 
    curToken = strtok(NULL, ";") 
} 

Я хочу, чтобы каждый arg[z] отлиты в массив символов - символьную строку [100] - и затем обрабатывается в алгоритмах У меня есть следующее. Каждые arg[z] необходимо в любой момент добавить в переменную строку. Я смущен указателями, но я постепенно улучшаюсь.

EDIT:

char string[100] = "ls ; date ; ls"; 

arg[0] будет Ls, arg[1] будет дата и arg[2] будет Ls после кода выше.

Я хочу, чтобы каждый аргумент возвращался в строку символов [100] и обрабатывал его с помощью алгоритмов.

+1

(в сторону) 'memset' не надежен с указателями; нет никакой гарантии, что нулевой указатель - все нули. (На общем оборудовании это, но цикл над 'args', чтобы установить каждый элемент в' NULL', более переносим и более явным.) –

+0

Что делать, если есть больше, чем '10' токенов? 'args' достаточно хорош для' 10'. Приведения к 'malloc' не требуются. Также, каков ваш реальный вопрос? – dirkgently

+1

Не совсем уверен, в чем вопрос, код выглядит отлично, за исключением того, что нет контроля над индексированием 'args'. – hmjd

ответ

0

Если вы хотите, чтобы части строки были скопированы в строку с фиксированной длиной [100], вам необходимо создать malloc 100 символов для каждого args [] внутри цикла и strncpy() результат strtok в него. strdup будет только выделить достаточно памяти для фактической длины переданной строки (плюс \ 0)

0

Это:

char** args = (char**)malloc(10*sizeof(char*)); 
memset(args, 0, sizeof(char*)*10); 

нарушается код. Во-первых, вы не должны вводить возвращаемое значение malloc(). Во-вторых, args является указателем на десять указателей на char. Вы не можете установить их на NULL с использованием memset(), нет гарантии, что «все байты равны нулю» совпадает с NULL. Вам нужно использовать цикл.

1

Самый простой способ - сохранить резервную копию исходной строки в некоторой временной переменной.

char string[100] = "ls ; date ; ls"; 
char temp_str[100] = {0}; 
strcpy (temp_str, string); 

Другой способ - это сделать strcat. z имеет количество аграментов.

memset(string, '\0', 100); 
for (i = 0; i < z; i++) 
{ 
    strcat(string, args[i]); 
    if (i != (z - 1)) 
    { 
     //if it is last string dont append semicolon 
     strcat(string, ";"); 
    } 
} 

Примечание: Позаботьтесь о границе проверки состояния

Смежные вопросы