我无法从文件中读取一串字符,然后使用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;
}
答案 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 ,循环将终止。