gpt4 book ai didi

有人可以解释为什么 token 总是会丢失单词而不是到达下一行吗?

转载 作者:行者123 更新时间:2023-11-30 14:48:07 26 4
gpt4 key购买 nike

int fp = open(file_name, O_CREAT | O_RDONLY, 0644);
if(fp < 0) {
perror("erro ao abrir o ficheiro");
_exit(-1);
}
char* notebook = myreadln(fp);
printf("%s\n====\n\n",notebook);
char* token = strtok(notebook, "\n");
while(token != NULL){
printf("%s\n",token );
new_line(d,token);
token = strtok(NULL, "\n");
}
{...}

在这段代码中,我使用一个文件加载 char* 笔记本,因此,我想使用“\n”将该 char* 分成几行,但输出是这样的:

Isto vai dar sort
$ ls
Jk isto e que vai
$| sort
Isto faz mais
$| head -1

====

Isto vai dar sort
Isto vai dar sort
vai dar sort
vai dar sort
dar sort
dar sort
sort
sort

有人可以解释为什么 token 总是会丢失单词而不是转到下一行吗?

我的函数new_line:数据 d 是指向我的结构数据的指针

void new_line(Data d, char* s){
char* aux = mystrdup(s);
printf("\t%s\n",aux);

int n = conta_palavras(aux); // number of words
char** args = malloc((n+1)*sizeof(char*)); // create space for n words
args[n] = NULL;

char** words = escreve_palavras(aux, args);

add(d,words);

}

mystrdup:

char * mystrdup (const char *s) {
if(s == NULL) return NULL;
char *d = malloc (strlen (s) + 1);
if (d == NULL) return NULL;
strcpy (d,s);
return d;
}

最佳答案

strtok 循环本身编写正确,如果没有函数 new_line(),它会输出一行,因为它会破坏 \处的字符串。 n.

所以函数 new_line() 一定会干扰它。让我猜猜怎么做。您希望将字符串分解为单词,这就是 new_line() 正在尝试做的事情。当我用下一个代码实现它时 - 嘿!我得到了你得到的输出。

#include <stdio.h>
#include <string.h>

void new_line(char *d, char *str)
{
char *tok = strtok(str, d);
}

int main() {
char notebook[] = "Isto vai dar sort";
char delim[] = " ";
char* token = strtok(notebook, "\n");
while(token != NULL){
printf("%s\n", token );
new_line(delim, token);
token = strtok(NULL, "\n");
}
}

程序输出:

Isto vai dar sortvai dar sortdar sortsort

Now strtok is not "reentrant", meaning that if you are using it in one function it cannot be used safely in another function. So let's try to get the answer you wanted by breaking the string at the spaces (and any trailing newline) right away:

#include <stdio.h>
#include <string.h>

int main() {
char notebook[] = "Isto vai dar sort";
char* token = strtok(notebook, " \n"); // added the space
while(token != NULL){
printf("%s\n", token );
token = strtok(NULL, " \n"); // added the space
}
}

现在程序输出是:

Istovaidarsort

我想这就是你想要的。

如果您想在不同的函数中使用 strtok,您应该使用 strtok_s (MSVC) 或 strtok_r (gcc)。

关于有人可以解释为什么 token 总是会丢失单词而不是到达下一行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50685657/

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