0

我正在开发一个 C 项目,用户可以直接通过该程序创建博客。我正在设置我的输出 HTML 和 CSS 文件,但似乎无法修复我遇到的这个错误。

需要明确的是,编译器不会发出错误或警告。

错误是这样的:对于我输入的某些(不是全部)博客标题,目录名称变为附加了%8B%FF,或只是%FF,或其他一些变体,但始终以%FF. 此文件夹不包含任何文件,并且在重新启动计算机之前无法删除。当错误未出现时,文件夹中存在文件。

我已经包含了我的大部分代码,因为我真的不明白这个错误。我相信错误出现在我要求创建 HTML 和 CSS 文件的底部。CreateNewBlog()如果没有这些行,则不会发生错误。

那么,%FF我的目录末尾的含义是什么,为什么会在那里?

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

void CreateNewBlog();
void NewBlogHTML(char path[92], char blog_title[64]);
void NewBlogCSS(char path[92], char blog_title[64]);

int main()
{
  CreateNewBlog();

  return 0;
}

void CreateNewBlog()
{
  char blog_title[64];
  char dir_name[64];
  char mkdir[70];
  char touch[70];
  char html_path[92];
  char css_path[92];
  int i = 0;

  printf("Enter blog title: ");

  fgets(blog_title, 64, stdin);
  blog_title[strlen(blog_title) - 1] = '\0';  // removes trailing '\n' from fgets()

  for (i = 0; blog_title[i]; i++) {           // convert "Blog Title" to "blog-title"
    if (blog_title[i] == ' ') {
      dir_name[i] = '-';
    } else dir_name[i] = tolower(blog_title[i]);
  }

  dir_name[strlen(dir_name)] = '\0';

  sprintf(mkdir, "mkdir %s", dir_name);
  system(mkdir);

  sprintf(touch, "touch %s/index.html", dir_name);
  system(touch);

  sprintf(html_path, "%s/index.html", dir_name);
  sprintf(css_path, "%s/style.css", dir_name);
  NewBlogHTML(html_path, blog_title);  // HERE IS THE PROBLEM (when uncommented)
  NewBlogCSS(css_path, blog_title);    //
}

void NewBlogHTML(char path[92], char blog_title[64])
{
  FILE *index = fopen(path, "w");
  // html file text
  fclose(index);
}

void NewBlogCSS(char path[92], char blog_title[64])
{
  FILE *style = fopen(path, "w");
  // css file text
  fclose(style);
}
4

2 回答 2

1
 for (i = 0; blog_title[i]; i++) {           // convert "Blog Title" to "blog-title"
    if (blog_title[i] == ' ') {
      dir_name[i] = '-';
    } else dir_name[i] = tolower(blog_title[i]);
  }

   dir_name[i] = '\0'; // <<-- Add this line
于 2013-03-30T17:55:23.517 回答
0

这是一个问题:

for (i = 0; blog_title[i]; i++) {           // convert "Blog Title" to "blog-title"
  if (blog_title[i] == ' ') {
    dir_name[i] = '-';
  } else dir_name[i] = tolower(blog_title[i]);
}

写入的最后一个字符dir_name[]never是因为循环体在is'\0'时不执行。blog_title[i]'\0'

您需要显式附加'\0'dir_name[]. 如果你不这样做,dir_name[]可能会在所有写入字符之后包含垃圾,只有在某个时候,纯粹的机会,它才会有'\0',它可以是函数返回地址的一部分,也可以是存储在堆。

Another, unrelated oddity is here:

sprintf(html_path, "%s/index.html/", dir_name);

Why is the file name ending in '/'?

于 2013-03-30T04:52:45.817 回答