gpt4 book ai didi

c - 迭代行而不传递偏移量

转载 作者:行者123 更新时间:2023-11-30 16:14:00 27 4
gpt4 key购买 nike

我可以使用以下函数来迭代一些文本并逐行抓取它:

int nextline(char * text, unsigned int * start_at, char * buffer) {
/*
it will return the length of the line if there is a line, or -1 otherwise.
it will fill the character buffer with the line
and return where the pointer has 'finished' for that line so it can be used again
*/
int i;
char c;

if (*start_at > strlen(text)) return -1;

for (i=0; (c = * (text + *start_at + i)); i++) {
buffer[i] = c;
if (c == '\0') break;
if (c == '\n') {
buffer[i+1] = '\0';
break;
}
}

* start_at = * start_at + i + 1;

return i;

}

但是这个函数需要传入一个偏移量,例如:

char * longtext = "This is what I went to do\nWhen I came over\nto the place and thought that\nhere we go again";
char buffer[60];
unsigned int line_length, start_at=0;

for (int i=1; (line_length = nextline(longtext, &start_at, buffer)) != -1; i++)
printf("Line %2d. %s\n", i, buffer);

我如何编写一个等效的函数,它“记住”光标所在的位置,并且我不需要不断将其传递回函数中?

最佳答案

如果您不想传递偏移量,可以通过在函数内部使用static 变量来跟踪当前偏移量来实现此目的。然而,这样做也有缺点。

假设您要使用static 变量作为偏移量。然后处理一个完整的字符串。现在,当您想处理另一个字符串时会发生什么?您需要以某种方式告诉该函数“重新开始”。另外,假设您想交替处理两个单独的字符串,即您首先在一个字符串上调用该函数,然后在另一个字符串上调用该函数,然后返回第一个字符串。内部状态无法管理它。

管理这些类型问题的最佳方法是按照您现在正在做的事情进行操作:传递变量的地址以跟踪状态。这样,由调用函数来跟踪当前状态,而您的 nextline 函数是无状态的。

标准库中有许多使用内部状态的旧函数,这些函数已被不使用内部状态的新函数所取代。一个值得注意的例子是 strtok。该函数使用内部状态来标记字符串。后来创建了 POSIX 函数 strtok_r,它接收一个附加的状态参数。

所以保持你的函数不变。通常认为不依赖内部状态是更好的设计。

关于c - 迭代行而不传递偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57847012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com