gpt4 book ai didi

c - 从字符串中获取元素

转载 作者:太空宇宙 更新时间:2023-11-04 02:06:53 25 4
gpt4 key购买 nike

我被一件相当微不足道的事情难住了......所以,基本上我希望第一个和最后一个之间的“单词”进入数据,最后一个进入关键。

仅限 C-POSIX,请。

strtok_r 是正确的选择还是我离题太远了?还有别的吗?

char *key = NULL, *data=NULL, *save=NULL;
char comando[1024];
fgets(comando, 512, stdin);

strtok_r(comando, " ",&save);

while(strcmp(save,"\n")){
strcat(data,strtok_r(NULL," ",&save));
}

key = strtok_r(NULL, "\n",&save);

P.S:comando 是 1024,因为内存不是问题,而且安全总比抱歉好。 fgets 读取 512,因为这是标准 unix 终端上的字符行限制。

最佳答案

您的代码将在此行崩溃:

strcat(data,strtok_r(NULL," ",&save));

因为您从未为数据保留空间。 strcat 将尝试写入一个NULL 内存地址。

另一件需要注意的事情是,您不应该依赖save 来检查行尾。根据 strtok 的联机帮助页:

The saveptr argument is a pointer to a char * variable that is used internally by strtok_r() in order to maintain context between successive calls that parse the same string.

依赖 strtok_r 之外的 saveptr 的值会破坏抽象层,您不应该对 strtok 如何使用 做任何假设>保存。这是不好的做法。

稍微好一点的方法是保留一个指向 strtok 返回的前一个标记的指针,以及一个指向当前标记的指针。当 strtok 返回 NULL 时,意味着没有更多的标记,然后 prev 将指向最后一个标记,即您的 key。这是一些代码:

char *key = NULL, *save=NULL;
char *prev, *curr;
char comando[1024];
char data[1024];

data[0] = '\0';
fgets(comando, 512, stdin);
prev = curr = strtok_r(comando, " ",&save);

while (curr != NULL) {
prev = curr;
curr = strtok_r(NULL, " ", &save);
if (curr != NULL)
strcat(data, prev);
}

key = prev;

请注意,我通过将其声明为数组而不是指针来为 data 分配空间。说明

data[0] = '\0';

是为了确保 strcat 在第一次调用中找到空终止字节。

你可以直接用key代替prev的使用,我保留它是为了让代码更具可读性。

忠告:永远记住 strtok 破坏性地修改了它的参数(你失去了定界字节的身份),并且你不能用常量字符串调用它。

注意:data 将包含每个串联的单词。你失去了空间。我不确定这是否是您想要的。如果不是,您可能想要使用比 strcat 更好的东西(顺便说一句,效率不是很高)。例如,您的代码使用 sprintf 将 token 打印到带有前导空格的 data 中,并在 data 中保留指向下一个空闲位置的指针.

关于c - 从字符串中获取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19705077/

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