Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回时strtok消失-1_C_Arrays_Token_Strtok - Fatal编程技术网

C 返回时strtok消失-1

C 返回时strtok消失-1,c,arrays,token,strtok,C,Arrays,Token,Strtok,因此,我正在编写代码,将字符串放入数组,它工作得很好,但是我希望它在我点击文件中的##时终止对字符串的读取。我正在运行一个循环并逐行解析字符串。在我的字符串解析器中,我放置了一个循环来检查##。它位于我的解析器函数的最后,它是: for (i = 0; i < strlen(line)); i++) { if ((buffer[i] == '#') && (buffer[i+1] == '#')) { return -1; } }

因此,我正在编写代码,将字符串放入数组,它工作得很好,但是我希望它在我点击文件中的##时终止对字符串的读取。我正在运行一个循环并逐行解析字符串。在我的字符串解析器中,我放置了一个循环来检查##。它位于我的解析器函数的最后,它是:

for (i = 0; i < strlen(line)); i++)
{
    if ((buffer[i] == '#') && (buffer[i+1] == '#'))
    {
        return -1;
    }
}
for(i=0;i
问题是,当它以##结尾到达行时,它不会将字符串解析到我的数组中。似乎只是在循环之前忽略了代码

作为补充信息,我使用strtok将令牌放在for循环前面的char*数组中的位置

编辑:这是我的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;
}
int-parseString(字符*行,字符***指令)
{
字符*缓冲区;
int-Token,i;
缓冲区=(字符*)malloc(strlen(行)*sizeof(字符));
strcpy(缓冲区、行);
(*inString)=(char**)malloc(MAX_TOKS*sizeof(char**));
令牌=0;
(*inString)[Token++]=strtok(缓冲区、分隔符);
而((*inString)[token]=strtok(NULL,分隔符))!=NULL)和&(tokenfor(i=0;i首先,您读取的是数组的越界,因为
array[-1]
不好。其次,使用一个变量来保存字符串长度,因为这样做会导致for循环为每次迭代重新计算
strlen(line)


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

缓冲区分配不足

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

分配的“缓冲区”可能丢失。
*inString
数组有一个指向“buffer”开头的指针,允许在调用例程中释放它,但这是不确定的。建议使用
*inString
的第一个元素显式保存该缓冲区

算法洞

(*inString)[token-1]==NULL
应该在
for()之前断言

O(n*n)通过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提供示例
行末尾带有##
MAX#u TOKS
分隔符

请不要在For循环中调用
strlen(行)
,并尝试对代码进行更好的格式化。它是否会在缓冲区[i-1]上崩溃如果i==0?我们能看到剩下的代码吗?前提是它不是很大。我只是做了一个编辑,这样你就可以看到函数的整个代码。哦,天哪。你知道你可以在一个块中将多行代码标记为代码吗?
// 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;
  }
}