想要从双指针传递单个char指针

时间:2013-07-06 04:32:50

标签: c string double-pointer

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

例如

输入 - 查询:“the”,“new”,“store”,“in”,“SF”

    stopwords: “the”, “in”

OUTPUT 新 商店 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);
    }

}

2 个答案:

答案 0 :(得分:2)

为简单起见,你可以假设一个双指针等同于一个二维数组(它不是!)。但是,这意味着您可以使用array-convention来访问双指针的内容。

#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

答案 1 :(得分: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;
}

此处显示的方法还避免了对所涉及阵列的大小进行硬编码的需要,从而减少了错误的可能性。