所以,我的问题很简单,我想创建一个函数来分隔文件中的单词并解析这些单词并为这些单词创建一个特殊的思考,但是,当我尝试分离时,我在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-&GT;编辑 而且,当我将strcat更改为:
strcat(token, &c)
我从调试器收到此错误:
APP.exe中0x20E801F2处的未处理异常:0xC0000005:Access 违规(参数:0x00000008)。
答案 0 :(得分:3)
这是错误的:
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()
,这通常是错误的。)
答案 1 :(得分:2)
strcat
期望以null结尾的字符串;你不能将指针传递给单个字符并期望它能够正常工作。
替换
strcat(token, (char*)c);
与
char tmp[2];
tmp[0] = c;
tmp[1] = '\0';
strcat(token, tmp);
让它发挥作用。
您还需要将token[0]
设置为零,以避免由于未初始化而导致未定义的行为。
答案 2 :(得分:2)
当您将c
投射到char *
时,您将字符中的任何值(例如十六进制中的100
)转换为内存地址(0x100
)并且然后在该内存地址处查找字符串。难怪它不起作用!在将字符弹出到strcat
之前,您需要将字符转换为字符串。
答案 3 :(得分:1)
三件事:
char c
转换为(char *) c
时,您说c是内存地址。实际上,这是一个价值。你可能想要的是对角色&c