fread(buf, lsize, 1, fp)
将读取1块
lsize
但是,字节数
fread
不关心内容,不会添加
'\0'
-正在终止的字节
字符串,所以
l1 = strlen(buf);
产生未定义的行为
因此,可以忽略结果(并且您的计数也有错误)。
请注意,文件末尾通常没有以0结尾的字节,
这甚至适用于包含文本的文件,它们通常以
换行符。
您必须自己设置0终止字节:
if (1 != fread(buf, lsize, 1, fp)) {
fclose(fp);
free(buf);
fputs("Entire read fails.\n", stderr);
exit(1);
}
buf[lsize] = '0';
您可以使用
strstr
要获取子字符串的位置,请执行以下操作:
for(i = 2; i < argc; ++i)
{
char *content = buf;
int count = 0;
while((content = strstr(content, argv[i])))
{
count++;
content++; // point to the next char in the substring
}
printf("The substring '%s' appears %d time(s)\n", argv[i], count);
}
你的计数错了,有一些错误。此比较
&buf[j] == argv[k]
是错误的,您正在比较指针,而不是内容。你必须使用
strcmp
比较字符串。在这种情况下,您必须使用
strncmp
因为你
只想匹配子字符串:
while(strncmp(&buf[j], argv[k], strlen(argv[k])) == 0)
{
// substring matched
}
但这也是错误的,因为你在递增
k
同样,这将
给你下一个论点,最后你可能会读到超出
argv
如果子字符串长于参数数。基于您的
代码,则必须比较字符:
while(buf[j] == argv[i][k])
{
j++;
k++;
}
您必须增加
counter
仅当子字符串匹配时,如
这是:
l1 = strlen(buf);
for (i = 2; i < argc; i++) {
int count = 0;
int k = 0; // running index for inspecting argv[i]
for (j = 0; j < l1; ++j) {
while(buf[j + k] == argv[i][k])
k++;
// if all characters of argv[i]
// matched, argv[i][k] will be the
// 0-terminating byte
if(argv[i][k] == 0)
count++;
// reset running index for argv[i]
// go to next char if buf
k = 0;
}
printf("The substring '%s' appears %d time(s)\n", argv[i], count);
}