【问题标题】:comparing strings read from a file比较从文件中读取的字符串
【发布时间】:2017-08-20 01:04:58
【问题描述】:

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

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

我在这里做错了什么?

【问题讨论】:

  • 你得到的输出是什么?
  • 老兄,不要这样复制粘贴代码。始终保持干燥(D不要R重复Y我们自己)。使用带有strncmp 的循环来缩短它。

标签: c string file-handling


【解决方案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);
        }    

    }
}

【讨论】:

    【解决方案2】:

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

    到此为止,您将该文本文件的所有单词都放在一个数组中..!!

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

    希望这会有所帮助:)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我有时会在同一个地方写这篇文章..可能对你有帮助..

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

        【讨论】:

          【解决方案5】:

          没有比一般帮助更真实的答案。

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

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

          2. 如果您遇到像这个巨大的“else if”这样看起来非常重复的问题,您可以使用循环。在这种情况下,某种循环会在每次迭代中减少一个值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多