获取以前缀开头的文件行

时间:2015-08-13 11:18:21

标签: c fopen getline plaintext strncmp

我正在尝试检测明文的哪一行以" linePrefix"开头。使用上面的代码,即使有巧合,strcmp永远不会返回0.有谁知道我在哪里失败了?

  const char PREFIX[] = {"linePrefix"};
  FILE *fp;
  char *line = NULL;
  char *aux = NULL;
  aux = (char *) malloc(16);
  size_t len = 0;
  ssize_t read;
  char path[] = {/*path*/};

  fp = fopen(path, "r");

  while ((read = getline(&line, &len, fp)) != -1) {
    strncpy(aux, line, 15);
    printf("strcmp: %i\n, strcmp(aux, PREFIX));
  }

2 个答案:

答案 0 :(得分:4)

您忘记在aux上添加字符串终结符:

strncpy(aux, line, 15);
aux[15] = `\0`;

请注意,在不需要复制字符串的情况下,可以使用更简单的方法进行比较。只需直接与line的开头比较:

while ((read = getline(&line, &len, fp)) != -1) {
  printf("strcmp: %i\n, strncmp(line, PREFIX, strlen(PREFIX)));
}

答案 1 :(得分:0)

最有可能的是,这些行超过15个字符,在这种情况下strncpy()会中断。 strncpy表现为:

  

如果s2指向的数组是一个短于n个字符的字符串,则为空字符   被附加到s1指向的数组中的副本,直到所有的字符都是   写入。

换句话说,如果没有空间,strncpy将不会终止程序,导致程序崩溃和刻录。因此,避免strncpy(),这是一个危险的功能,程序员经常无法正确使用。

更好的代码:

set { cboRubroPadre.SelectedItem = value; }

set { cboRubroPadre.SelectedItem = cboRubroPadre.FindString(value.Nombre); }

set { cboRubroPadre.SelectedItem = cboRubroPadre.FindStringExact(value.Nombre); }