首页 文章

当返回-1时,strtok消失了

提问于
浏览
0

所以我正在编写代码将字符串放入数组中并且它工作正常,但是当我在文件中按##时,我希望它终止字符串的读取 . 我正在运行循环并逐行解析字符串 . 在我的字符串解析器中,我放了一个循环来检查## . 它位于我的解析器函数的最后,它会:

for (i = 0; i < strlen(line)); i++)
{
    if ((buffer[i] == '#') && (buffer[i+1] == '#'))
    {
        return -1;
    }
}

问题是,当它在最后用##命中行时,它不会将字符串解析为我的数组 . 看起来它只是忽略了这个循环之前的代码 .

作为附加信息我正在使用strtok将令牌放在我的char *数组中的位置之前for循环 .

编辑:这是我的parseString函数:

int parseString(char* line, char*** inString)
{
    char* buffer;
    int Token, i;

    buffer = (char*) malloc(strlen(line) * sizeof(char));
    strcpy(buffer,line);
    (*inString) = (char**) malloc(MAX_TOKS * sizeof(char**));

    Token = 0;  
    (*inString)[Token++] = strtok(buffer, DELIMITERS);

    while ((((*inString)[token] = strtok(NULL, DELIMITERS)) != NULL) && (Token < MAX_TOKS))
        Token++;

    for(i=0; i<strlen(line); i++)
    {
        if ((buffer[i] == '#') && (buffer[i+1] == '#'))
        {
            return -1;
        }            
    }
    return Token;
}

2 回答

  • 0

    首先,你正在读出一个数组的界限,因为 array[-1] 并不好 . 其次,使用变量来保存字符串长度,因为这样做会导致for循环为每次迭代重新计算 strlen(line) .

    现在,对于您的问题,似乎您将它放在将其添加到数组的代码之前 . 如果你能给我们一些代码,那会有所帮助 .

  • 0

    Insufficient buffer allocation

    // buffer = (char*) malloc(strlen(line) * sizeof(char));
    buffer = malloc(strlen(line) + 1);  // +1 for the \0
    strcpy(buffer,line);
    

    Memory Leak

    分配的'buffer'可能会丢失 . *inString array_有一个指向'buffer'开头的指针,允许它在调用例程中被释放,但那就是iffy . 建议使用 *inString 的第一个元素显式保存该缓冲区 .

    Algorithm hole

    应在 for() 之前声明 (*inString)[token-1] == NULL .

    O(n*n) via strlen()

    建议:

    // for(i=0; i<strlen(line); i++)
    int length = strlen(line); // `length` should be used in `malloc()` too.
    for(i=0; i<length; i++)
    

    OP's early edit approach was almost OK

    只需要开始索引为1而不是0.不需要测试 line 的每个索引 i ,但是(length-1) . 所以 (i = 1; i<length; i++)(i = 0; i<length-1; i++) .

    // for (i = 0; i < strlen(line)); i++) {
    int length = strlen(line);
    for (i = 1; i<length; i++) { // start at 1
      if ((buffer[i-1] == '#') && (buffer[i] == '#')) {
        return -1;
      }
    }
    

    为了获得更好的帮助,建议OP提供样本 lineline with the ## at the endMAX_TOKSDELIMITERS .

相关问题