Итак, моя проблема проста, я хочу создать функцию для разделения слов в файле и синтаксического анализа этих слов и создания особого мышления для этих слов, но у меня возникает ошибка в strcat, когда я пытаюсь отделить токены:
посмотрите код:
#include <stdio.h>
#include <string>
#include <Windows.h>
using namespace std;
bool compile(FILE *fp)
{
char c;
char token[256];
bool _return = false;
while ((c = getc(fp)) != EOF)
{
if(isalpha(c))
{
// The error is here
strcat(token, (char*)c);
printf("%c\n", c);
}
else
{
printf("----> %c\n", c);
}
}
printf("%s\n", token);
return _return;
}
int main()
{
char *filename = "test.in";
FILE *fp = fopen(filename, "rb");
if(!fp)
{
return 1;
}
if(!compile(fp))
{
printf("ERROR...\n");
}
fclose(fp);
}
Код строится нормально, но, когда я отлаживаю, отладчик переходит в файл strcat.asm 🙁
Итак, где моя ошибка, спасибо за помощь. (:
-0-0-0-0-0-0-0-0-0-> изменить
И когда я изменяю strcat на:
strcat(token, &c)
Я получаю эту ошибку от отладчика:
Необработанное исключение в 0x20E801F2 в APP.exe: 0xC0000005: доступ
нарушение (параметры: 0x00000008).
strcat
ожидает завершающуюся нулем строку; Вы не можете передать указатель на отдельный символ и ожидать, что он будет работать правильно.
замещать
strcat(token, (char*)c);
с
char tmp[2];
tmp[0] = c;
tmp[1] = '\0';
strcat(token, tmp);
чтобы это работало.
Вам также нужно установить token[0]
в ноль, чтобы избежать неопределенного поведения из-за его не инициализации.
Это не верно:
strcat(token, (char *) c);
Переменная c
это не строка, это всего лишь один символ. Актерский состав (char *)
просто маскирует ошибку компилятора.
Если вы хотите добавить символы в строку по одному,
std::size_t pos = 0;
char buf[256];
// ...
if (isalpha(c)) {
assert(pos < sizeof(buf));
buf[pos++] = c;
}
// ...
assert(pos < sizeof(buf));
buf[pos] = '\0';
printf("buf = %s\n", buf);
Или, вы знаете, сделать это простым способом:
#include <string>
std::string s;
// ...
if (isalpha(c)) {
s += c;
}
// ...
printf("buf = %s\n", s.c_str());
Не пытайтесь отлаживать внутренности strcat()
, Если ваша программа падает внутри strcat()
, это ошибка в вызывающей функции. (Обычно это ошибка даже позвонить strcat()
совсем.)
Когда вы разыгрываете c
в char *
Вы поворачиваете любое значение, которое было в характере (скажем, 100
в шестнадцатеричном виде) в адрес памяти (0x100
), а затем ищет строку по этому адресу памяти. Не удивительно, что это не работает! Вы захотите превратить персонажа в строку, прежде чем вставлять его в strcat
,
Три вещи:
char c
в (char *) c
Вы говорите, что с является адресом памяти. На самом деле это ценность. То, что вы, вероятно, хотите, это ссылка на персонажа, &c