创建子字符串的 C 错误 - 可能是内存错误?

标签 c debugging memory-leaks substring token

我是 C 的新手,想知道是否可以得到一些帮助!我已经为这个错误工作了 +15 个小时。

所以,这个程序是一个分词器。

基本上,该程序应该采用字符串或“ token 流”并将其分解为“ token ”。 “ token ”是一个字符串,可以是单词、十六进制整数、八进制整数、十进制整数、浮点整数或符号。

我发布的代码只是出现问题的代码,我程序的另一部分是创建 token 的部分。

下面代码的工作原理是这样的:它获取一个“ token 流”,然后从该流中找到下一个 token 。完成后,它将创建“ token 流”的子字符串减去新 token ,并将其作为新“ token 流”返回。

本质上,当字符串 "0x4356/*abdc 0777 */[]87656879jlhg kl(/j jlkh 'no thank you'/" 被传递时,程序将正确执行所有操作,除非"jlhg kl(/j jlkh 'no thank you'/" 通过。一旦通过我的程序,就会创建一个 "jlhg" token ,然后将其添加到标记流的结束。因此,要分解的新标记流变为 "kl(/j jlkh 'no thank you'/jlhg" 其中 jlhg 被添加到最后,它以前不存在。它再次做同样奇怪的事情,紧接着,但是用 "kl" 代替。

它只在极其奇怪的情况下才会这样做,所以我不确定原因。我在我的程序中放置了 print 语句,一切正常进行,除了看似无处不在,程序只会在最后添加这些语句。这就是为什么我觉得它可能是内存问题,但我完全不知道从这里去哪里。

任何帮助将不胜感激!!!!

编辑:如果你传递字符串 "array[xyz ] += pi 3.14159e-10 A12B"输出应该是:

单词“数组”

左大括号“[”

单词“xyz”

右大括号"]"

加等于“+=”

单词“pi”

float “3.14159e-10”

单词“A12B”

我的 TokenizerT 是这样的:

struct TokenizerT_
{
    char *tokenType;
    char *token;
};

typedef struct TokenizerT_ TokenizerT;

相关代码:

/*
* TKNewStream takes two TokenizerT objects. 
* It will locate the index of the end   of the last token, 
* and create a substring with the new string to be tokenized.
* @tokenStream: old token stream
* @newToken: new token created from old token stream
*
*/

char *TKGetNextStream(char *tokenStream, char *newToken)
{
    int i,
        index = 0,
        count = 0;

    char last = newToken[strlen(newToken)-1];

    for(i = 0; i < strlen(newToken); i++)
    {
        if(newToken[i] == last)
        {
            count++;
        }
    }

    for(i = 0; i < strlen(tokenStream); i++)
    {
        if(tokenStream[i] == last && count == 1)
        {
            index = i + 1;
            break;
        }
        else if(tokenStream[i] == last)
        {
            count--;
        }
    }

    char *ret = malloc(sizeof(char)*(strlen(tokenStream) - index));

    for(i = 0; i < strlen(tokenStream) - index; i++)
    {
        ret[i] = tokenStream[i+index];
    }

    return ret;
}

/*
* This is my main
*/
int main(int argc, char **argv)
{

    char *string = "0x4356/*abdc 0777 */[]87656879jlhg kl(/j jlkh 'no thank you' /";

    TokenizerT *newToken = malloc(sizeof(struct TokenizerT_)),
               *tokenStream = malloc(sizeof(struct TokenizerT_));  

    tokenStream->token = string;

    while(newToken != NULL)
    {
        newToken = TKCreate(TKGetNextToken(tokenStream));

        if(newToken != NULL)
        {
            tokenStream->token = TKGetNextStream(tokenStream->token,
                                                 newToken->token);

            printf("%s \"%s\"\n",
                   newToken->tokenType,
                   newToken->token);
        }
    }

    TKDestroy(newToken);

    return 0;

}

最佳答案

ret 中创建的字符串没有正确地以 null 结尾。因此,所有处理字符串的函数都将假设它继续进行,直到恰好在分配的内存之后找到下一个随机零字节。

要解决此问题,请为 ret 再分配一个字节的空间并将其设置为零,或使用现有函数(如 strdup())复制字符串:

ret = strdup(tokenStream + index);

关于创建子字符串的 C 错误 - 可能是内存错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28397393/

相关文章:

c - 返回带有指针的 c 数组

c - 从用户读取未知长度的字符串(工作一次并停止)

c - 三爪分区(动态编程示例)

C - 函数返回一个数组

ubuntu - Google crashpad 上的一个交叉编译平台应用程序。 Ubuntu 中无法读取 dmp 文件

java - Eclipse 条件断点损坏了吗?

c++ - 在 gdb 中打印整个链表?

javascript - Node : How to free buffers that get allocated outside of the V8 memory heap

objective-c - Objective-C : Potential Memory Leak in code

c++ - valgrind 在使用 libxml2 时向我显示泄漏