0

我必须编写一个接收 2 个双指针(均为 char 类型)的函数。第一个双指针有一个查询值字符串,第二个有停用词。这个想法是从查询字符串中消除停用词并返回所有没有这些停用词的单词。

例如

输入 - 查询:“the”、“new”、“store”、“in”、“SF”</p>

    stopwords: “the”, “in”

OUTPUT新店顺丰

我在尝试使用 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);
    }

}
4

2 回答 2

2

为简单起见,您可以假设双指针等效于二维数组(事实并非如此!)。但是,这意味着您可以使用数组约定来访问双指针的内容。

#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

于 2013-07-06T04:53:08.943 回答
2

@Binayaka Chakraborty 的解决方案解决了这个问题,但我认为提供一个仅使用指针并显示适当使用的替代方案可能很有用,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;
}

此处显示的方法还避免了对所涉及的数组大小进行硬编码的需要,从而减少了潜在的错误。

于 2013-07-06T05:07:52.570 回答