Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法比较C中指针的字符数组和字符数组_C_Arrays_Pointers - Fatal编程技术网

无法比较C中指针的字符数组和字符数组

无法比较C中指针的字符数组和字符数组,c,arrays,pointers,C,Arrays,Pointers,我有一些单词,我存储在类似指针的字符数组中 char* someWords[]={"a", "about", "above","across", "after", "afterwards", "again", "against", "all", "almost", "alone", "along", "already","also","although","always","am","among"} //etc,320 words char x[1024]; // used this

我有一些单词,我存储在类似指针的字符数组中

char* someWords[]={"a", "about", "above","across", "after", "afterwards",      
"again", "against", "all",
"almost", "alone", "along", "already","also","although","always","am","among"} //etc,320 words
char x[1024]; // used this to read file 
然后我读另一个文件,取出单词,以便与某些单词进行比较,如果它们相同,我就不把它们计算在内。我做了这样的事

 while (fscanf(fone,"%1023s",x) == 1) { 
    i=0;


    while(i<541 && x!=someWords[i]){ //if file contains stopwords.  also tried (strcmp(x,someWords[i])!=0)

    i++;

    //printf("\n len:%d",strlen(x));

    }
    if(i==541)
    {
        printf("\n%s is not stop word ",x);   

    }
    else
    {
        printf("\n%s is stop word ",x);

    }
} 

问题是所有的单词都是以非停止字的形式打印的,这让我意识到程序不能比较x和someWords[i]。那么我该怎么做才能修复它呢?我应该使用哪种类型的变量?或者我应该完全改变我阅读文件的方式吗

要比较两个字符串,请使用strcmpx,someWords[i]。如果它们相等,则结果将为0


你无法与x相比=someWords[i],因为它只比较指针,而不是字符串的内容。

要比较两个字符串,请使用strcmpx,someWords[i]。如果它们相等,则结果将为0


你无法与x相比=someWords[i]因为这只比较指针,而不是字符串的内容。

我对您的程序做了一些修改,它工作得很好。我有

用空指针终止单词列表,这样我们就不依赖数字了。 用过的strcmp。 从stdin而不是从文件读取预期输入是一系列简单的字,这些字可能与停止字之一匹配,也可能与停止字之一不匹配。 引入了一个found标志和一个mid-loop break,而不是在循环条件中进行比较,这样我们就可以在找到时进行操作。 节目:

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

char* someWords[]=
    {   "a", "about", "above","across", 
        "after", "afterwards",      
        "almost", "alone", "along", 
        "already","also","although",
        "always","am","among", 0};      //etc,320 words

char x[1024]; // used this to read file 

int main()
{
    while (scanf("%1023s",x) == 1)
    {
        int found = 0;

        for(int i=0; someWords[i]; i++)
        {   printf("%s, %s\n",someWords[i], x);
            if( strcmp(x,someWords[i])==0 )
            {
                found = 1;
                break;
            }
        }       
        if(!found)
        {
            printf("\n%s is not stop word\n",x);   

        }
        else
        {
            printf("\n%s is stop word\n",x);

        }
    }   return 0;
}
示例会话:

$ gcc -std=c11 -Wall -o word-arr  word-arr.c  && ./word-arr 
above lalala <-- input 
a, above 
about, above 
above, above

above is stop word 
a, lalala 
about, lalala 
above, lalala 
across, lalala 
after, lalala 
afterwards, lalala 
almost, lalala 
alone, lalala 
along, lalala 
already, lalala 
also, lalala 
although, lalala 
always, lalala 
am, lalala 
among, lalala

lalala is not stop word

我对你的程序做了一些修改,效果很好。我有

用空指针终止单词列表,这样我们就不依赖数字了。 用过的strcmp。 从stdin而不是从文件读取预期输入是一系列简单的字,这些字可能与停止字之一匹配,也可能与停止字之一不匹配。 引入了一个found标志和一个mid-loop break,而不是在循环条件中进行比较,这样我们就可以在找到时进行操作。 节目:

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

char* someWords[]=
    {   "a", "about", "above","across", 
        "after", "afterwards",      
        "almost", "alone", "along", 
        "already","also","although",
        "always","am","among", 0};      //etc,320 words

char x[1024]; // used this to read file 

int main()
{
    while (scanf("%1023s",x) == 1)
    {
        int found = 0;

        for(int i=0; someWords[i]; i++)
        {   printf("%s, %s\n",someWords[i], x);
            if( strcmp(x,someWords[i])==0 )
            {
                found = 1;
                break;
            }
        }       
        if(!found)
        {
            printf("\n%s is not stop word\n",x);   

        }
        else
        {
            printf("\n%s is stop word\n",x);

        }
    }   return 0;
}
示例会话:

$ gcc -std=c11 -Wall -o word-arr  word-arr.c  && ./word-arr 
above lalala <-- input 
a, above 
about, above 
above, above

above is stop word 
a, lalala 
about, lalala 
above, lalala 
across, lalala 
after, lalala 
afterwards, lalala 
almost, lalala 
alone, lalala 
along, lalala 
already, lalala 
also, lalala 
although, lalala 
always, lalala 
am, lalala 
among, lalala

lalala is not stop word

那么,x数组包含什么-一个单词,还是一堆单词?如果它包含一个大字符串中的一串单词,您需要以某种方式解析它们,然后将每个单词与一些单词进行比较;指针比较通常会失败,与C相反,C会导致真正的比较。除非这是一个赋值,否则还是使用C,它将为您节省大量的工作。或脚本语言之一。@OldProgrammer x数组包含一堆单词。但我认为每次fscanf工作时,它只为一个单词指定x。这就是为什么我要和someWords比较,那么,x数组包含什么,一个单词,还是一堆单词?如果它包含一个大字符串中的一串单词,您需要以某种方式解析它们,然后将每个单词与一些单词进行比较;指针比较通常会失败,与C相反,C会导致真正的比较。除非这是一个赋值,否则还是使用C,它将为您节省大量的工作。或脚本语言之一。@OldProgrammer x数组包含一堆单词。但我认为每次fscanf工作时,它只为一个单词指定x。所以这就是为什么我比较了一些词,我已经用过了,但是当我注释掉的时候,它不起作用了,我只能对你发布的代码进行注释。除了strcmp和要检查的字数之外,此代码似乎是正确的。要么你错误地实现了strcmp,要么x不包含你认为它能做的。我认为x不包含我认为它能做的。当我调试它时,我在x中看到数百个无意义的值,如零、斜杠、单词等。我已经用过了,但当我注释掉时,它不起作用。我只能对你发布的代码进行注释。除了strcmp和要检查的字数之外,此代码似乎是正确的。要么你错误地实现了strcmp,要么x不包含你认为它能做的。我认为x不包含我认为它能做的。当我调试它时,我在x中看到数百个无意义的值,如零、斜杠、单词等。它处理连续的单词,解释得很好,非常感谢!但是,如果我的stopWords数组的某些单元格包含空字符串,则它不起作用。假设我的数组是这样的:someWords[10]=沿着,someWords[11]=,someWords[12]=,someWords[13]=已经,someWords[14]=。如何克服这种情况?使用空指针终止的想法来自mainnt argc中的argv,char**argv使用空指针冗余终止argv,并使用argc提供计数。要处理空指针,有两种可能。1定义一个不能出现在数据中的停止字。或2依靠计数。如果单词数组是在编译时已知并填充的真实数组,那么很容易计算sizeofsomeWords/sizeofsomeWords[0];但是如果someWords只是一个指向动态分配数组的指针的话,那么这种方法就会悄无声息地失败,这是一种很容易想象的改变。它可以处理连续的单词,并且解释得很好,谢谢
这么多!但是,如果我的stopWords数组的某些单元格包含空字符串,则它不起作用。假设我的数组是这样的:someWords[10]=沿着,someWords[11]=,someWords[12]=,someWords[13]=已经,someWords[14]=。如何克服这种情况?使用空指针终止的想法来自mainnt argc中的argv,char**argv使用空指针冗余终止argv,并使用argc提供计数。要处理空指针,有两种可能。1定义一个不能出现在数据中的停止字。或2依靠计数。如果单词数组是在编译时已知并填充的真实数组,那么很容易计算sizeofsomeWords/sizeofsomeWords[0];但是,如果someWords只是指向一个动态分配数组的指针(这是一个很容易想象的变化),那么这种方法就会悄无声息地失败。