нежелательные случайные символы из ниоткуда в строке C - PullRequest
0 голосов
/ 05 марта 2020

Я делаю программу, которая берет стандартный текстовый файл и преобразует его в документ HTML. по большей части он работает нормально, и я просто сейчас улучшаю его функциональность, но есть одна странная вещь, которая происходит, когда я сохраняю заголовок в массив строк / символов для последующей печати. 6 символов, случайным образом определяемые магической силой каждый раз, когда я запускаю двоичный файл, добавляются в начало строки "title".

Вот код, который, по моему мнению, является проблемой:

char title[128]; /*handles the title of the webpage*/

printf("Creating file %s", htmlname);
  /*begins creating the first open-tags, from the doctype to <title>*/
  puttag(html, "!DOCTYPE html");
  puttag(html, "html");
  puttag(html, "head");
  puttag(html, "title");
/*reads the start of txt until it finds a newline; prints all characters it finds along the way*/
ch = fgetc(txt);
  while (ch != '\n')
  {
    fprintf(html, "%c", ch);
    addchar(title, ch);
    ch = fgetc(txt);
  }
/*closes <title> and <head>; opens <body>*/
  closetag(html, "title");
  closetag(html, "head");
  puttag(html, "body");
  /*puts string "title" in <h1> tags*/
  puttag(html, "h1");
  fprintf(html, "%s", title);
  closetag(html, "h1");


/*FUNCTION DEFINITIONS*/
/*puts string "tag" in <> brackets and prints it into fp*/
void puttag(FILE *fp, char *tag)
{
  fprintf(fp, "\n<%s>\n", tag);
}

/*puts string "tag in </> brackets and prints it into fp"*/
void closetag(FILE *fp, char *tag)
{
  fprintf(fp, "\n</%s>\n", tag);
}

/*adds character "ch" to string "str"*/
void addchar(char *str, char ch)
{
  int i = strlen(str);
  str[i] = ch;
  str[i + 1] = '\0';
}




и вывод, созданный этим фрагментом кода, выглядит следующим образом:

<!DOCTYPE html>

<html>

<head>

<title>
This is the title
</title>

</head>

<body>

<h1>
p6+��This is the title
</h1>

Я новичок в C и абсолютно не знаю, почему это происходит, поэтому я прошу прощения, если это слишком много или слишком мало примеров для определения проблемы.

Одна вещь, которую я заметил, это то, что эта проблема появилась только тогда, когда я добавлял более поздние части кода в программу, хотя я абсолютно уверен, что у них ничего нет делать с этим вопросом. Это единственное место, где используется эта строка, и строки после этого кода вообще не используются (кроме случаев, когда я проверяю, какова длина строки, когда возвращается 23, 6 символов длиннее, чем фактическая длина заголовка ). Другое дело, что иногда, возможно, при первой компиляции после перезапуска (?) Программа возвращает правильную строку. Я не очень много исследовал.

Если кто-нибудь знает, что происходит, помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 05 марта 2020

Более простой способ прочитать строку текста - использовать fgets. Он будет перезаписывать все, что находится в title, поэтому не имеет значения, инициализирован он или нет - хотя рекомендуется проверять инициализацию всех переменных. И он не будет заполнять конец вашего массива, так как вы можете указать максимальное количество символов для чтения.

fgets(title, 128, txt);

Единственное предостережение в том, что он также будет включать \n, если строка прочитана в подойдет в указанный размер. Но достаточно просто проверить, есть ли такой в ​​строке, и удалить его следующим образом ...

if(strchr(title, '\n'))
    {
    *(strchr(title, '\n'))='\0';
    }

Кроме того, вместо использования числа 128 в вашем коде, вы можете использовать команду определите так, чтобы ваш массив и вызов fgets были согласованы

#define TITLE_SIZE (128)

char title[TITLE_SIZE];
fgets(title, TITLE_SIZE, txt);
if(strchr(title, '\n'))
    {
    *(strchr(title, '\n'))='\0';
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...