strcat с указателями на символы

Итак, моя проблема проста, я хочу создать функцию для разделения слов в файле и синтаксического анализа этих слов и создания особого мышления для этих слов, но у меня возникает ошибка в 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).

1

Решение

strcat ожидает завершающуюся нулем строку; Вы не можете передать указатель на отдельный символ и ожидать, что он будет работать правильно.

замещать

strcat(token, (char*)c);

с

char tmp[2];
tmp[0] = c;
tmp[1] = '\0';
strcat(token, tmp);

чтобы это работало.

Вам также нужно установить token[0] в ноль, чтобы избежать неопределенного поведения из-за его не инициализации.

2

Другие решения

Это не верно:

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() совсем.)

3

Когда вы разыгрываете c в char *Вы поворачиваете любое значение, которое было в характере (скажем, 100 в шестнадцатеричном виде) в адрес памяти (0x100), а затем ищет строку по этому адресу памяти. Не удивительно, что это не работает! Вы захотите превратить персонажа в строку, прежде чем вставлять его в strcat,

2

Три вещи:

  • Вы не проверяете, не переполнили ли вы 256 символов в буфере
  • Когда вы конвертируете char c в (char *) c Вы говорите, что с является адресом памяти. На самом деле это ценность. То, что вы, вероятно, хотите, это ссылка на персонажа, &c
  • Вам нужно добавить нулевой терминатор в конец того, что вы объединяете.
1
По вопросам рекламы [email protected]