0

所以我有这个任务:我有一个源文件,例如新闻网站,其中有像<meta name="author" content="Go Outside">. 而且,如您所知,该源文件包含大量信息。我的任务是找到那个元作者标签并将该元标签的内容打印到屏幕上,现在它将是“走出去”。我什至不知道如何开始这样做。我有一个想法扫描 18 个字符,并检查是否需要元标记,但这并不像我想的那样工作:

   while(feof(src_file) == 0){
      char key[18];
      int i = 0;
      while (i < 18 && (feof(src_file) == 0)){
         key[i] = fgetc(src_file);
         printf("%c", key[i]);
         i++;
      }
      printf("\n%s", key);
   }

问题是它在这一行打印出垃圾。

您的帮助将不胜感激,因为我已经连续工作和学习了 10 个小时,您也许可以使我免于发疯。谢谢。

4

1 回答 1

1

您缺少零终止char-array 以使其能够在打印之前作为字符串处理。

修改您的代码,如下所示:

...
{
  char key[18 + 1]; /* add one for the zero-termination */
  memset(key, 0, sizeof(key)); /* zero out the whole array, so there is no need to add any zero-terminator in any case */ 
  ...

或者像这样:

...
{
  char key[18 + 1]; /* add one for the zero-termination */

  ... /* read here */

  key[18] = '\0'; /* set zero terminator */
  printf("\n%s", key);
  ...

更新:

正如我在对您的问题的评论中提到的那样,与使用方式有关的“另一个故事feof()是错误的。

请注意,只有在读取 EOF 后才会结束读取循环,以防出现错误或真正的文件结尾。然后将此 EOF 伪字符添加到保存读取结果的字符数组中。

您可能想使用以下结构来阅读:

{
  int c = 0;
  do
  {
    char key[18 + 1];
    memset(key, 0, sizeof(key));

    size_t i = 0;
    while ((i < 18) && (EOF != (c = fgetc(src_file))))
    {
       key[i] = c;
       printf("%c", key[i]);
       i++;
    }

    printf("\n%s\n", key);
  } while (EOF != c);
}
/* Arriving here means fgetc() returned EOF. As this can either mean end-of-file was
   reached **or** an error occurred, ferror() is called to find out what happend: */
if (ferror(src_file))
{
  fprintf(stderr, "fgetc() failed.\n");
}

有关此问题的详细讨论,您可能想阅读此问题及其答案

于 2013-05-25T17:43:48.900 回答