2017-02-08 5 views
1

/* Я не уверен, что мой код для сохранения токенов в массиве точным. Это потому, что когда я запускаю свою программу, код для сравнения token[0] с моей переменной не дает выхода или не выполняет назначенные функции.как сохранить токен строки, сохранить его содержимое в массив, затем использовать это содержимое для дальнейшего сравнения.

Поэтому я уверен, что есть что-то неточное о моем кодирования. */

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

int main() 
{ 
    //variable declarations   
    const char *array[] = {"ax","bo","cf"}; 
    char delim[]=" \n"; 
    char* myline; 
    size_t max = 500; 
    char* token1; 
    char* token2[max]; 
    int n = 0; 


    while(1) //loop always 
    {  
     printf("Enter an argument\n"); //asks for an input 


     getline (&myline, &max, stdin);  //read the input/line    

     //for loop -- splits up the line into tokens 
     for(token1 = strtok(myline, " "); token1 != NULL; token1 = strtok(NULL, delim)) 
     {     

     token2[n] = malloc(strlen(token1)+1);  //allocate some space/memory to token2[n] 

     //save the token in an array by copying from token1 to token2 
     strcpy(token2[n],token1); 


     int m; 

     for(m = 0; m<sizeof(array);m++) //loop through the array elements for comparison 
     { 
      //compare array at index m with token at index 0 -- compare only first token with a specific variable 

      if(strcmp(token2[0], array[m]) == 0) 
      { 
       printf("equal"); 
      } 
     } 
     } 

    free(token2[n]);  //deallocate assigned memory 
    }  
return(0); 
} 
+0

Единственная проблема с вашим кодом - стиль, а не проверка возвращаемого значения malloc. –

+1

Где вы читаете эту строку? –

+1

строка считывается из stdin с использованием getline – Atinuke

ответ

0

Я думаю, вы должны попробовать вектор строки, как

вектор < строка> Обл = { «Топор»,» bo "," cf "};

+0

Это 'C++'. OP не найдет это полезным, поскольку вопрос помечен в 'c'. – RoadRunner

0

Их, кажется, несколько вопросов в текущем коде:

  • for(m = 0; m<strlen;m++) не является правильным. strlen() - это функция <string.h>, используемая для получения длины строки C. Так как вы хотите array[i], вы должны указать размер array в охрану. Чтобы найти размер массива, вы можете использовать sizeof(array)/sizeof(array[0]). Было бы хорошо, чтобы включить это в макросе:

    #define ARRAYSIZE(x) (sizeof x/sizeof x[0]) 
    

    Тогда ваш цикл может быть:

    size_t m; 
    for(m = 0; m<ARRAYSIZE(array); m++) 
    
  • Вы должны проверить возвращение malloc(), так как он может вернуться NULL о невозможности выделения пространства , Вот способ проверить это:

    token2[n] = malloc(strlen(token1)+1); 
    if (token2[n] == NULL) { 
        /* handle error */ 
    
  • можно пропустить шаг malloc()/strcpy(), просто используя strdup.

  • getline() возвращает -1 при прочтении строки, поэтому полезно проверить это. Он также добавляет символ \n в конце буфера, поэтому вам нужно удалить это. В противном случае strcmp никогда не найдет равных строк, так как вы будете сравнивать strcmp("string\n", "string"). Вам необходимо найти символ \n в вашем буфере и заменить его нулевым терминатором \0.

    Вы можете достичь этого, как:

    size_t slen = strlen(myline); 
    if (slen > 0 && myline[slen-1] == '\n') { 
        myline[slen-1] = '\0'; 
    } 
    
  • Вы также должны free() все char* указателей в token2[].

  • Поскольку вы используете тот же самый делиметр для strtok(), его лучше сделать это const. Итак, const char *delim = " \n";.

Alot исправлений я предложил в комментариях, так что я не отправлял их здесь, как вы, казалось, обновил свой код с этими предложениями.

+0

пробуя их .... – Atinuke

+0

@Atinuke Эти проблемы должны помочь вам отладить ваш код. – RoadRunner