比较C中的2个子串

时间:2014-02-08 15:45:11

标签: c linux

我无法从文件中读取一串字符,然后使用C在ubuntu上比较我的作业的第一部分。 所以程序编译得很好,但是当它到达代码的比较字符串部分下面的while循环时,我似乎陷入无限循环。感谢。

另外,我可以获得一些关于如何从终端获取多个输入来比较“bar”文件中的字符串和终端之后字符的x子串字符串的建议。我的输出应该如下:

% echo "aaab" > bar
% ./p05 bar aa B
2
1
%

这是我到目前为止所做的:

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

int main(void /*int argc, char *argv[]*/) 
{

  /******* Open, Read, Close file**********/
  FILE *ReadFile;

  ReadFile = fopen(/*argv[1]*/"bar", "r");

  if(NULL == ReadFile)
    {
      printf("\n file did not open \n");
      return 1;
    }

  fseek(ReadFile, 0 , SEEK_END);  
  int size = ftell(ReadFile); 
  rewind(ReadFile);                

  char *content = calloc( size +1, 1); 

  fread(content,1,size,ReadFile);     

  /*fclose(ReadFile); */                 

  printf("you made it past opening and reading file\n");
  printf("your file size is %i\n",size);

  /*********************************/


  /******String compare and print*****/
  int count =0;
  const char *tmp = "Helololll";
  while (content = strstr(content,"a"))
    {
      count++;
      tmp++;
  }
  printf("Your count is:%i\n",count);

  /***********************************/
    return 0;
}

1 个答案:

答案 0 :(得分:1)

如果'a'中出现字符content,则以下循环无限。

while (content = strstr(content, "a"))
{
    count ++;
    tmp ++;
}

它重置content以指向第一次迭代时第一次出现'a'的位置。未来的迭代不会改变content的值。 IOW,content指向"aaab",因此对strstr的调用每次都会找到第一个'a'。如果您将tmp++替换为循环内的content++,那么它将更接近您想要的内容。我可能会用for循环来编写它,以使你更加清楚你正在迭代。

char const * const needle = "a";
for (char *haystack=content; haystack=strstr(haystack, needle); haystack++) {
    count++;
}

haystack 会增加,因此它的大小总是会减小。最终,您将无法在 haystack 中找到 needle ,循环将终止。