c - 为什么程序不读取第二个参数文件?

标签 c linux string

因此作业是使用要搜索的输入文件和要搜索的输入来实现子字符串搜索程序。我创建了以下代码:

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

int main(int argc,char *argv[])
{
  FILE *fp;
  fp = fopen(argv[1],"r");
  if (fp == NULL)
    {
      printf("Error");
      return 0;
    }
  char* tmpp[100];
  int count = 0;
  char* nexts = argv[2];
  char* tmp = fgets(tmpp,100,fp);
  while(tmp = strstr(tmp,nexts))
    {
      count++;
      tmp++;
    }
  printf("%d\n\n",count);
  fclose(fp);

  return 0;
}    

程序可以编译,但是当我在 ubuntu 终端中实现它时:

echo "aabb" >beta
./a.out beta a
1

为什么程序没有正确使用第一个参数 (argv[1]) 作为 beta 并使用第二个参数 (argv[2]) 作为 beta ?

最佳答案

您应该打开一个文件,然后从该文件读取字节到临时缓冲区:

FILE *file = fopen("file", "r");
while (1) {
    char buffer[BUFSIZ+1];
    size_t nread = fread(buffer, 1, sizeof(buffer)-1, file);
    if (nread == 0) break; // read error or EOF
    buffer[nread] = 0;

    // chunk with BUFSIZ amount of bytes is available via buffer (and is zero-terminated)
}

如果您想在文件中搜索字符串/模式,请注意文件中查找的模式可能会跨越您的 block 大小边界,例如:您查找“hello”,BUFSIZ 为 512。文件包含“hello” ” 在字节 510 处。显然,如果您按 512 读取,您将得到以“he”结尾的第一个 block ,以及以“llo”开头的第二个 block 。对于所有 block 大小,这种情况的概率都不为零(SIZE_MAX 除外,但由于其他原因缓冲区大小是不可能的)。处理边界可能非常复杂。

关于c - 为什么程序不读取第二个参数文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21652274/

相关文章:

c - 返回字符串而不是 int

c - 取消引用指针的后增量?

python - 如何使用asm代码为Python构建C库?

Java在arraylist中排序数字

python - 检查字符串 Python 中的模式

c - 如何使用预处理器宏填充字符串

cs50 pset5 字典.c : this code is giving segmentation fault

linux - 如果它崩溃,如何重新启动守护进程服务?

linux - csh shell 脚本故障排除

c - 如何在 Linux 中更改特定应用程序的音量