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

comparing strings read from a file

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

我的 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

我做错了什么?

检查函数:

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);
        }    

    }
}

我可以为此给出一个算法。您可以做的是从文本文件中读取整个文本并将其分配给单个 string.Then 将从文本文件中获得的字符串拆分为以 space 作为分隔符的单词,并将它们添加到数组中。

到目前为止,您已经将那个文本文件的所有单词放在一个数组中了..!!

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

希望对您有所帮助:)

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

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])

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

您可以通过多种方式来完成您想要做的事情,但为了与您当前的设计保持一致,您需要这样的东西:

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 中的每个字符并查找在 2 个字符串之间匹配的 n 个字符。在第二个循环之后,i 将包含匹配的字符数,因此如果它等于 n 那么您就赢了。

我写过 post 有时回到同一个地方..可能对你有帮助..

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

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

这个程序在可读性方面有很多问题。

  1. 不要使用无法使用的变量名。尝试使用能够自我解释的名称,例如 "numberOfLetters"。不要仅仅因为它们很短就强迫自己使用短变量。您仍然可以使用 i、j、k 进行计数,因为它们被广泛执行并因此而闻名,但一般来说:Readability > Short

  2. 如果你有像这个巨人一样看起来非常重复的问题 "else if" 你可以使用循环。在这种情况下,某种循环使每次迭代都减少一个值。