所以我正在编写将字符串放入数组的代码并且它工作正常,但是当我在文件中找到##时,我希望它终止字符串的读取。我正在运行一个循环并逐行解析字符串。在我的字符串解析器中,我放了一个循环来检查##。它位于我的解析器函数的最后,它是:
for (i = 0; i < strlen(line)); i++)
{
if ((buffer[i] == '#') && (buffer[i+1] == '#'))
{
return -1;
}
}
问题是,当它在结束时遇到##的行时,它不会将字符串解析为我的数组。看起来它只是忽略了循环之前的代码。
作为附加信息,我正在使用strtok将令牌放在我的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;
}
答案 0 :(得分:0)
首先,你正在读出一个数组的界限,因为array[-1]
不好。其次,使用变量来保存字符串长度,因为这样做会导致for循环为每次迭代重新计算strlen(line)
。
现在,对于您的问题,似乎您将放在之前将代码添加到数组中。如果你能给我们一些代码,那会有所帮助。
答案 1 :(得分:0)
缓冲区分配不足
// buffer = (char*) malloc(strlen(line) * sizeof(char));
buffer = malloc(strlen(line) + 1); // +1 for the \0
strcpy(buffer,line);
内存泄漏
分配的“缓冲区”可能会丢失。 *inString
array_有一个指向'buffer'开头的指针,允许它在调用例程中被释放,但那就是iffy。建议使用*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的早期编辑方法几乎可以
只需要开始索引为1而不是0.不需要测试i
的每个索引line
,但是(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提供示例line
,line with the ## at the end
,MAX_TOKS
和DELIMITERS
。