【问题标题】:strcat with char pointersstrcat 与 char 指针
【发布时间】:2012-11-20 01:41:14
【问题描述】:

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

【问题讨论】:

  • 令牌未初始化。在进入循环之前尝试token[0] = 0;。
  • 但是将字符转换为char* 是没有意义的,所以你还是坏了。
  • 而且你不能对字符进行排序。所以要么做 token[1] = 0;在 strcat 之前。或者将 strcat 替换为 token[token_len++] = c;令牌[token_len] = 0;但请检查您没有超过令牌的缓冲区大小。

标签: c++ strcat


【解决方案1】:

这是错误的:

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() 通常都是错误的。)

【讨论】:

    【解决方案2】:

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

    替换

    strcat(token, (char*)c);
    

    与

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

    让它工作。

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

    【讨论】:

    • @DietrichEpp 你是对的,最新的 C++ 标准已经改变了这一点(POD 过去根据旧标准是零初始化的)。谢谢!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      三件事:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 2019-01-15
        • 2021-11-26
        • 2019-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多