【问题标题】:Want to pass a single char pointer from a double pointer想要从双指针传递单个字符指针
【发布时间】:2013-07-06 04:32:50
【问题描述】:

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

例如

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

    stopwords: “the”, “in”

输出 新的 店铺 顺丰

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

}

【问题讨论】:

  • 您也可以这样做:final_str=strtok(*query,*stopwords); 和 final_str=strtok(NULL,*stopwords); 在 strtok 的情况下已在答案中描述了休息
  • @PHIfounder:您建议的 strtok 调用将使用 stopwords 数组的第一个字符串中的字母作为分隔符拆分 query 数组中的第一个字符串,我认为这不是 OP 的意图。
  • @Simon 这就是我把它写成评论的原因。
  • 指向指针的指针不是“双指针”......这是不正确且令人困惑的术语。
  • @JimBalter 是的,起初我以为它是指向double 的指针。

标签: c string double-pointer


【解决方案1】:

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

#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

【讨论】:

  • 所以如果我想将查询的内容检索到单个字符指针中,我可以使用语法 *query[i] 访问它吗?
  • @user2555541:您可以将结果连接成单个字符指针
  • 感谢您的帮助。我该怎么做?同样,使用 strcat 只需要访问单个字符 ptr。其实这就是我一直在尝试做的。将 double ptr 的内容移动到单个 char* 中,然后使用 strtok 函数消除分隔符。
【解决方案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;
}

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

【讨论】:

  • 是的,在看到 OP 使用 strtok() 之后,我也不想使用它 :) +1 删除硬编码 ^_^
  • 当我在 gdb 中运行您的代码时,它指示 segmentation fault。
  • 您的代码有缺陷,char *query="the new store in SF" 将query 声明为指针并分配给常量字符串,这意味着在strtok 修改它时无法修改它,它在运行时会出现分段错误调试器(GDB)。自己检查。
  • @PHIfounder:感谢您的指正。我已经修改了代码给strtok()一个可以修改的字符串。
  • @Simon 不客气,+1 动态分配内存 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 2016-08-26
相关资源
最近更新 更多