2013-10-04 3 views
0

Так что я пишу код, чтобы поместить строки в массивы, и он работает отлично, однако я хочу, чтобы он завершил чтение строк при ударе ## в файле. Я запускаю цикл и разбору строк последовательно. Внутри синтаксического анализатора строк я поставил цикл для проверки ##. Это в самом конце моей функции синтаксического анализа, и он идет:strtok исчезает при возврате -1

for (i = 0; i < strlen(line)); i++) 
{ 
    if ((buffer[i] == '#') && (buffer[i+1] == '#')) 
    { 
     return -1; 
    } 
} 

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

В качестве дополнительной информации я использую strtok для размещения маркеров в позициях в моем массиве char * до этого цикла.

EDIT: Вот моя parseString функция:

int parseString(char* line, char*** inString) 
{ 
    char* buffer; 
    int Token, i; 

    buffer = (char*) malloc(strlen(line) * sizeof(char)); 
    strcpy(buffer,line); 
    (*inString) = (char**) malloc(MAX_TOKS * sizeof(char**)); 

    Token = 0; 
    (*inString)[Token++] = strtok(buffer, DELIMITERS); 

    while ((((*inString)[token] = strtok(NULL, DELIMITERS)) != NULL) && (Token < MAX_TOKS)) 
     Token++; 

    for(i=0; i<strlen(line); i++) 
    { 
     if ((buffer[i] == '#') && (buffer[i+1] == '#')) 
     { 
      return -1; 
     }    
    } 
    return Token; 
} 
+2

Просьба не называть 'strlen (line)' в условном выражении for и пытаться отформатировать код немного лучше. – goji

+3

Неужели это не сбой на буфере [i-1], если i == 0? – duDE

+0

Можем ли мы увидеть остальную часть кода? При условии, что он не огромен. – goji

ответ

0

Прежде всего, вы читаете из границ на массиве, потому что array[-1] не хорошо. Во-вторых, используйте переменную для хранения длины строки, поскольку способ, которым вы это делаете, заставляет цикл for переоценивать strlen(line) для каждой итерации.

Теперь, для вашей проблемы, кажется, вы кладете ее до кода, который добавляет его в массив. Если бы вы могли дать нам немного больше кода, это поможет.

0

Недостаточное выделение буфера

// buffer = (char*) malloc(strlen(line) * sizeof(char)); 
buffer = malloc(strlen(line) + 1); // +1 for the \0 
strcpy(buffer,line); 

Утечка памяти

Выделенный 'буфер', могут быть потеряны. У массива *inString есть указатель на начало «буфера», что позволяет ему освобождаться в вызывающей подпрограмме, но это iffy. Предложите использовать первый элемент *inString, чтобы сохранить этот буфер явно.

Алгоритм отверстие

(*inString)[token-1] == NULL должны быть заявлены до того for().

О (п * п) с помощью StrLen()

Предложение:

// for(i=0; i<strlen(line); i++) 
int length = strlen(line); // `length` should be used in `malloc()` too. 
for(i=0; i<length; i++) 

рано редактировать OP Подход был почти OK

Просто необходимо, чтобы начать индексацию на 1, а не 0. Нет необходимости тестировать каждый индекс i из line, но (длина-1). Таким образом, (i = 1; i<length; i++) или (i = 0; i<length-1; i++).

// for (i = 0; i < strlen(line)); i++) { 
int length = strlen(line); 
for (i = 1; i<length; i++) { // start at 1 
    if ((buffer[i-1] == '#') && (buffer[i] == '#')) { 
    return -1; 
    } 
} 

Для лучшей помощи, рекомендуем О.П. предоставить образец line, line with the ## at the end, MAX_TOKS и DELIMITERS.

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