【问题标题】:Split char* at delimiter in freestanding mode c++在独立模式c ++的分隔符处拆分char *
【发布时间】:2018-03-15 10:06:38
【问题描述】:

我正在尝试编写自己的操作系统。我已经按照 OSDev Wiki 上的教程进行操作,现在我正在编写带有命令的控制台模式。我需要能够将char* 拆分为char**,而无需所有库功能(因此是独立的)。我已经尝试迭代直到遇到分隔符等,但是无论我这样做,我都会在第一个结果的末尾遇到垃圾。我究竟做错了什么?这是我目前所拥有的:

static char** splitStr (char* string, char delim) {

    char returner[VGA_WIDTH][255];
    int loc = 0;
    int innerLoc = 0;
    for (int i = 0; string[i] != 0x00; i++) {
        char c = string[i];
        if (c != delim) {
            returner[loc][innerLoc] = c;
            innerLoc++;
        } else {
            print ("a string was ");
            println (returner[loc]);
            innerLoc = 0;
            loc++;
        }
    }
    print ("the first string was ");
    println (returner[0]);
    return (char**)returner;
}

我在问一个关于如何在 C++ 独立模式下编写特定函数的问题。

【问题讨论】:

  • 您正在返回一个指向本地数组的指针,该数组在函数结束后立即被销毁。
  • @Galik 这是否意味着我需要分配内存,然后引用它?
  • 是的,你应该分配内存
  • @JavaxCosten 是的,如果你想让它在函数结束后继续存在,它需要动态创建,而不是在堆栈上。

标签: c++ freestanding


【解决方案1】:
void split(const char* str, const char d, char** into)
{
    if(str != NULL && into != NULL)
    {
        int n = 0;
        int c = 0;
        for(int i = 0; str[c] != '\0'; i++,c++)
        {
            into[n][i] = str[c];
            if(str[c] == d)
            {
                into[n][i] = '\0';
                i = -1;
                ++n;
            }
        }
    }
}

我正在使用calloc 进行分配以摆脱垃圾字符。

编辑:在写入指针之前,您应该在 char** 内分配指针。

void allocarr(char** pointers, int bytes, int slots)
{
    int i = 0;
    while(i <= slots)
    {
        pointers[i] = (char*)calloc(1, bytes);
        ++i;
    }
}

...

char** sa = (char**)malloc(50*sizeof(char*));
allocarr(sa, 512, 50);
split("Hello;World;", ';', sa);
puts(sa[0]);

【讨论】:

  • 非常感谢您的快速回复。我会马上测试这段代码。
  • @JavaxCosten 不客气,这是一个 C 函数,不是 C++,但它适用于两者,顺便说一下,操作系统通常是用 C 编写的。
  • 我知道,但我发现 C++ 更令人愉快(语法更好,更面向对象)。
  • 刚刚测试编译,我收到以下错误:'calloc' was not declared in this scope'malloc' was not declared in this scope
  • 我可以使用new 运算符吗?
猜你喜欢
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 2023-04-10
  • 2011-06-03
  • 2013-06-07
  • 1970-01-01
相关资源
最近更新 更多