将文本文件中的字符串与C中的另一个列表进行比较

时间:2015-08-11 06:54:30

标签: c

我有一个实验室来比较代码中给出的数组中的两个字符串和来自.txt文件的另一个字符串:

while ((c = getc(fp)) != EOF) {
    printf("%c" c);
    name1 = c;
    test = strcmp(name, name1);

我收到错误:

  

指针和整数之间的比较

我想知道如何更改C变量,以便将其与strcmp()进行比较?

编辑:

int validName(const char name[ ]) 
{
  char name1[100];
  int test, c;

  FILE *fp = NULL;
  fp = fopen("keywords.txt", "r");

  if (fp == NULL){
      printf("error \n");
      exit(1);
 }

  while ((c = getc(fp)) != EOF) {
    fscanf(fp, "%s", name1);
    test = strcmp(name, name1);
    printf("test =%d\n", test);
    if(test ==0){
        c = 1;
    }
//  printf("test1");

}

if (c = 1) {
    return 1;
}
else
    return 0;

fclose(fp);

}

3 个答案:

答案 0 :(得分:2)

替代 :您可以使用fscanf(fp,"%s",name);并将其与name1进行比较。而不是逐个字符和形成字符串。 注意:name1应该是char[]有一些内存。这两个都是char[]喜欢

您的错误 :您正在strcmp中比较int和char *。您需要char*。你可以按照上面提到的方式进行。

char name[30],name1[30];

int strcmp(const char * str1,const char * str2);

比较两个字符串将C字符串str1与C字符串str2进行比较。

此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或直到达到终止空字符。此函数执行字符的二进制比较

注意: 为了在看到匹配后停止,您可以轻松拥有

if(strcmp(name,name1)==0)
   break;

OR

 if(strcmp(name,name1)==0)
   {
    //  call some function to process name 
   }

回答最后一个问题:好的,在这种情况下,您必须编写自定义函数。然后,您只需忽略所有空格,然后仅比较字母数字字符。 isalpha()等函数会有所帮助。

答案 1 :(得分:0)

您尝试使用strcmp()比较非字符串与字符串。 strcmp()的声明是

int strcmp(const char *str1, const char *str2)

此外,你可以像这样逐行获取

const size_t name1 = 100;
char* line = malloc(name1);
while (fgets(line, name1, fp) != NULL)
{
// bla bla
}

或者,您希望通过空格逐字逐句地尝试代码片段。

while(fscanf(fp, " %s", name1) != EOF)
{
    //bla bla
}

所以,我认为你的代码应该像

int validName(const char name[ ]) {
int test;

FILE *fp = NULL;
fp = fopen("keywords.txt", "r");

if (fp == NULL){
    printf("error \n");
    exit(1);
}

const size_t name1 = 100;
char* line = malloc(name1);
while (fgets(line, name1, fp) != NULL)
{
    test = strcmp(name, name1);
    printf("test =%d\n", test);

    /*
    if Return value(test) < 0 then it indicates name is less than name1.

    if Return value(test) > 0 then it indicates name1 is less than name.

    if Return value(test) = 0 then it indicates name is equal to name1.
    */

    if(test == 0) // if name and name1 same
    {
        return /*something*/
    }

}
fclose(fp);
}

答案 2 :(得分:0)

在这部分代码中:

while ((c = getc(fp)) != EOF) {
    fscanf(fp, "%s", name1);
    test = strcmp(name, name1);
    printf("test =%d\n", test);
    if(test ==0){
        c = 1;
    }

当你首先使用getc然后使用fscanf时,getc会读取fp的第一个字符,然后fscanf将忽略该字符并从其余部分读取以供例外:

keywords.txt:

 Template

,传递的值为Template 因此Template存储在名称变量中,并存储名称emplate

而不是使用:

    while ((c = getc(fp)) != EOF) 

你可以使用:

    while (fscanf(fp, "%s", name1) != EOF) 

我认为您希望在test==0时停止此循环,而不是使用:

  if(test ==0){
        c = 1;
    }

使用:

 while (fscanf(fp, "%s", name1) != EOF) {           
        test = strcmp(name, name1);
        printf("test =%d\n", test);
        if (test == 0) {
            fclose(fp);
            return 1;
        }
        //  printf("test1");

    }
    fclose(fp);

    return 0;

注意:返回其余代码后没有帮助,所以我在返回之前放了fclose