0

平文のどの行が「linePrefix」で始まるかを検出しようとしています。上記のコードを使用すると、偶然があったとしても、strcmp0 が返されることはありません。

  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

0

ほとんどの場合、行が 15 文字を超えています。その場合、strncpy() は壊れます。strncpy は次のように動作します。

s2 が指す配列が n 文字より短い文字列である場合、合計 n 文字が書き込まれるまで、s1 が指す配列内のコピーにヌル文字が追加されます。

つまり、余裕がない場合、strncpy はプログラムを null 終了せず、クラッシュして書き込みます。したがって、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 に答える