0

我正在尝试检测明文的哪些行以“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));
  }
4

2 回答 2

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)));
}
于 2015-08-13T11:22:20.963 回答
0

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

如果 s2 指向的数组是一个短于 n 个字符的字符串,则将空字符附加到 s1 指向的数组的副本中,直到总共写入 n 个字符。

换句话说,如果没有空间,strncpy 不会空终止程序,导致程序崩溃和烧毁。因此,避免使用 strncpy(),它是程序员经常无法正确使用的危险函数。

更好的代码:

size_t length = strlen(line);

if(length > MAX_LENGTH)
{
  length = MAX_LENGTH;
}

memcpy(aux, line, length);
aux[length] = '\0';
于 2015-08-13T11:44:36.160 回答