比较从文件中读取的字符串

时间:2017-03-27 10:54:54

标签: c string file-handling

我编写了一个程序,用户输入一个字符串,并将该字符串与文件中的每个字符串进行比较。如果文件中的任何字符串或子字符串与输入的字符串用户匹配,则应显示文件中的字符串。

我的NOW.txt文件的内容:

india

ind

in

indian

i

indians

这是我的代码:

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

int main()
{
    int i,j,n,p;
    char m[50], d[50];
    FILE *fp;
    fp=fopen("NOW.TXT","r");
    printf("Enter a word\n");
    scanf("%s", m);
    n = strlen(m);

    while( fgets (d, 50, fp)!=NULL ) 
    {    
         p=strlen(d);

         for(j=0; j<p; j++){
        for (i=0; i<n; i++){
        if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] && m[14]==d[14] && m[15]==d[15])
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] && m[14]==d[14] )
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] )
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12])
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] )
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10])
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] )
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8])
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7])
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] )
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] )
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4])
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3]  )
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2]  )
            printf("%s ",d );
        else if( m[0]==d[0] && m[1]==d[1])
            printf("%s ",d );
        else if( m[0]==d[0] )
            printf("%s ",d );
        else 
            printf(" No such word exists in file");
    }
   }
  }
}

当我输入:

india

输出应为:

   india

   indian

   indians

我在这里做错了什么?

5 个答案:

答案 0 :(得分:1)

检查功能:

char *strstr(const char *haystack, const char *needle)https://www.tutorialspoint.com/c_standard_library/c_function_strstr.htm

int strncmp(const char *str1, const char *str2, size_t n)https://www.tutorialspoint.com/c_standard_library/c_function_strncmp.htm

这将帮助你进行子串匹配。

您的程序可能会被更改为(未选中):

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

int main()
{

    char m[50], d[50];
    FILE *fp;
    fp=fopen("NOW.TXT","r");
    printf("Enter a word\n");
    scanf("%s", m);


    while( fgets (d, 50, fp)!=NULL ) 
    {    
        if (strstr(d, m) != NULL) {
            printf("%s ", d);
        }    

    }
}

答案 1 :(得分:0)

我可以为此提供算法。您可以做的是从文本文件中读取整个文本并将其分配给单个字符串。然后将从文本文件中获取的字符串拆分为以空格作为分隔符的单词并将其添加到数组中。

直到这一点,您将在单个数组中使用该文本文件的所有单词.. !!

现在你可以做的是为数组中的每个字符串检查它是否包含用户给出的输入...如果是,则打印该字符串..

希望这会有所帮助:)

答案 2 :(得分:0)

所以这段代码完全没有意义。

for(j=0; j<p; j++){
  for (i=0; i<n; i++){
    if( m[0]==d[0] && m[1]==d[1] && m[2]==d[2] && m[3]==d[3] && m[4]==d[4] && m[5]== d[5] && m[6]== d[6] && m[7]==d[7] && m[8]==d[8] && m[9]==d[9] && m[10]==d[10] && m[11]==d[11] && m[12]==d[12] && m[13]==d[13] && m[14]==d[14] && m[15]==d[15])

您在m中为d中的每个字符循环遍历所有字符,然后随机比较两个字符串中的字符,而不管每个字符串的长度。

有几种方法可以做你想要做的事情,但是为了与你当前的设计保持一致你想要的东西有点像这样:

for(j=0;j<p;j++) {
  for(i=0;(i+j<p) && (i<n) && (m[i]==d[i+j]);i++);
    if(i==n) {
      printf("%s ",d);
      break;
    }
}

这将循环遍历d中的每个字符,并查找两个字符串之间匹配的n个字符。在第二个循环之后,i将包含匹配的字符数,因此如果它等于n,那么您将获胜。

答案 3 :(得分:0)

我有时会把帖子写回同一个地方..可能对你有帮助..

http://clanguagestuff.blogspot.in/2015/06/comparing-username-stored-in-file-in-c.html

答案 4 :(得分:0)

没有真正的答案更像是一般的帮助。

该程序在可读性方面存在许多问题。

  1. 不要使用不可用的变量名。尝试使用解释自己的名称,如“numberOfLetters”。不要强迫自己使用短变量,因为它们很短。您仍然可以使用i,j,k进行计数,因为它们被广泛执行且已知,但一般而言:可读性&gt;短

  2. 如果您遇到的问题似乎非常重要,就像这个巨大的“其他如果”机会你可以使用循环。在这种情况下,某种循环会使每次迭代的值减少一个。