1

所以,我的问题很简单,我想创建一个函数来分隔文件中的单词并解析这些单词并为这些单词创建一个特殊的想法,但是,当我尝试分离标记时,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)

我从调试器收到此错误:

APP.exe 中 0x20E801F2 处的未处理异常:0xC0000005:访问冲突(参数:0x00000008)。

4

4 回答 4

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()。)

于 2012-11-20T01:45:42.203 回答
2

strcat需要一个以 null 结尾的字符串;您不能将指针传递给单个字符并期望它正常工作。

代替

strcat(token, (char*)c);

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

让它工作。

您还需要设置token[0]为零以避免由于未初始化而导致的未定义行为。

于 2012-11-20T01:44:55.060 回答
2

当您c转换为 时char *,您将字符中的任何值(例如100十六进制)转换为内存地址 ( 0x100),然后在该内存地址处查找字符串。难怪它不起作用!在将字符弹出到strcat.

于 2012-11-20T01:46:54.650 回答
1

三件事:

  • 您不检查是否溢出缓冲区中的 256 个字符
  • 当您转换为时char c(char *) c您说 c 是内存地址。实际上,它是一个值。你可能想要的是对角色的引用,&c
  • 您需要在要连接的内容末尾添加一个空终止符。
于 2012-11-20T01:46:24.720 回答