2013-07-06 6 views
0

Мне нужно написать функцию, которая принимает 2 двойных указателя (оба типа char). Первый двойной указатель имеет строку значений запроса, а второй имеет стоп-слова. Идея состоит в том, чтобы исключить стоп-слова из строки запроса и вернуть все слова без этих стоп-слов.Хотите передать один указатель на указатель с двойной указатель

Например

Input - запрос: «в» и «новый», «магазин», «в», «SF»

stopwords: “the”, “in” 

ВЫВОД новый магазин SF

Я написал следующий код при попытке использовать strtok, который принимает только одиночные указатели на типы char. Как получить доступ к содержимому двойного указателя?

Благодаря

#include <stdio.h> 

void remove_stopwords(char **query, int query_length, char **stopwords, int stopwords_length) { 
    char *final_str; 

    final_str = strtok(query[0], stopwords[0]); 
    while(final_str != NULL) 
    { 
     printf("%s\n", final_str); 
     final_str = strtok(NULL, stopwords); 
    } 

} 
+0

Вы также можете сделать это следующим образом: 'final_str = strtok (* query, * stopwords);' и 'final_str = strtok (NULL, * stopwords);' в случае strtok как отдыха описано в ответах – 0decimal0

+0

@PHIfounder: ваш предложенный вызов strtok разделил бы первую строку в массиве 'query', используя буквы в первой строке массива' stopwords' в качестве разделителей, что я не думаю, что это намерение OP. – Simon

+0

@Simon Вот почему я написал это как комментарий. – 0decimal0

ответ

2

Для простоты можно считать, двойной указатель будет эквивалентно 2d массив (это не так!). Однако это означает, что вы можете использовать соглашение о массиве для доступа к содержимому двойного указателя.

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

char *query[5] = {"the","new","store","in","SF"}; 
char *stopwords[2] = {"the","in"}; 
char main_array[256]; 

void remove_stopwords(char **query,int query_length, char **stopwords, int stopwords_length); 

int main() 
{ 
    remove_stopwords(query,5,stopwords,2); 
    puts(main_array); 
    return 0; 
} 

void remove_stopwords(char **query,int query_length, char **stopwords, int stopwords_length) 
{ 
    int i,j,found; 
    for(i=0;i<query_length;i++) 
    { 
     found=0; 
     for(j=0;j<stopwords_length;j++) 
     { 
      if(strcmp(query[i],stopwords[j])==0) 
      { 
       found=1; 
       break; 
      } 
     } 
     if(found==0) 
     { 
      printf("%s ",query[i]); 
      strncat(main_array,query[i],strlen(query[i])); 
     } 
    } 
} 

Выход: new store SF newstoreSF

+0

Итак, если я хочу получить содержимое запроса в один указатель на символ, могу ли я получить к нему доступ с помощью синтаксиса * query [i]? – user2555541

+0

@ user2555541: Вы можете объединить результаты в один указатель char –

+0

Спасибо за вашу помощь. Как мне это сделать? Опять же, использование strcat требует доступа только к одному элементу char ptr. На самом деле это то, что я пытался сделать. Переместите содержимое двойного ptr в один символ *, а затем используйте функцию strtok, которая устраняет разделители. – user2555541

2

решение @Binayaka Чакраборти в решить эту проблему, но я думал, что это может быть полезно, чтобы предложить альтернативу, которая использовала указатели только и показал правильное использование strtok(), использование которых может быть непонятно в вопросе.

В частности, второй параметр strtok() является указателем на строку, в которой перечислены все односимвольные разделители, которые будут использоваться. Нельзя использовать strtok(), чтобы разделить строку на основе многосимвольных разделителей, как представляется, было намерением в вопросе.

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

void remove_stopwords(char *query, char **stopwords) { 
    char *final_str = strtok(query, " "); 
    while(final_str != NULL) { 
     int isStop = 0; 
     char **s; 
     for (s = stopwords; *s; s++) { 
      if (strcmp(final_str,*s) == 0) { 
       isStop = 1; 
      } 
     } 
     if (!isStop) printf("%s ", final_str); 
     final_str = strtok(NULL, " "); 
    } 
} 

int main() { 
    const char *q = "the new store in SF"; 
    char *query = malloc(strlen(q)+1); 
    /* We copy the string before calling remove_stopwords() because 
     strtok must be able to modify the string given as its first 
     parameter */ 
    strcpy(query,q); 
    char *stopwords[] = {"the", "in", NULL}; 
    remove_stopwords(query,stopwords); 
    return 0; 
} 

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

+1

Да, увидев использование OP strtok(), я не хотел его использовать :) +1 для удаления hardcoding^_^ –

+0

Спасибо за это. Я понимаю, что ты сделал сейчас. – user2555541

+0

Когда я запускаю ваш код в gdb, он указывает на ошибку сегментации. – 0decimal0

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