gpt4 book ai didi

c - strtok 问题,它没有按预期工作

转载 作者:行者123 更新时间:2023-11-30 18:32:47 25 4
gpt4 key购买 nike

我有一个读取格式化文件的函数。它看起来像这样:

1;Name_of_the_author;The date when the quote was published;The author of the quote;The quote
2;Name_of_the_author_2;The date when the second quote was published;The author of the second quote;The second quote

所以,分隔符是 ; 。我要做的就是检查每个序列/标记并检查它是否正确。然而问题是,它没有获得所有 token ,只是获得前三个 token ,在它刚刚中断的日期之后,它不会移动......这是附加的代码函数。忽略评论,这是一个学校项目,评论是罗马尼亚语。

int svnCheckDb()
{
FILE *file;
int k, p, i=2, m, j=0;
char mystring[1000000], *var, *var2, *string;
file = fopen("db.txt", "r"); //deschidem fisierul
if(file == NULL) {
return 0;
}
else {
//il putem accesa.
while(fgets(mystring, 1000000, file) ) {
if(j != 0)
{
//nu luam si prima linie cu descrierea repo-ului, prelucram doar citatele, j-ul numara randul pe care suntem
//separam cu strtok linia citita si verificam fiecare informatie in parte pentru a fi corecta
var = strtok(mystring, ";");
k=1;
/*
k numara string-urile citite din descrierea citatelor tocmai citita. Primul e numarul de ordine, al doilea e utilizatorul
care a adaugat citatul, al treilea reprezinta data adaugarii citatului, dupa care urmeaza citatul.
*/
while(var != NULL) {
printf("k is %d and var is %s \n", k, var);
switch(k)
{
case 1:
//numarul de ordine. Daca e 0, inseamna ca nu e numar, returnam false
i = atoi(var);
if(i == 0)
return 0;
break;
case 2:
//utilizatorul care a adaugat citatul. Daca e gol sau nu e format doar din caractere a-z A-Z, returnam false
for( m = 0; m < strlen(var); m++ )
if(!isalpha(var[m]))
return 0;
break;
case 3:
//data la care a fost adaugat citatul. Intrucat folosim formatul DD MM YY cu spatii intre ele, vom verifica daca e ok in fisier
string = var;
var2 = strtok(string, " ");
p=1; //folosim p sa vedem daca am ajuns la zi, luna sau an
while(var2 != NULL)
{
switch(p)
{
case 1:
//ziua
i = atoi(var2);
if(i == 0)
return 0;
else if(i > 31 || i < 1)
return 0;
break;
case 2:
//luna, care e formata din primele 3 caractere ale lunii si trebuie sa respecte formatul acesta
if( strlen(var2) == 3)
{
for( m = 0; m < strlen(var2); m++ )
if(!isalpha(var2[m]))
return 0;
}
else return 0;
break;
case 3:
//anul.
i = atoi(var2);
if(i == 0)
return 0;
break;
}

var2 = strtok(NULL, " ");
p++;
}
break;
case 4:
//cine a adaugat citatul, vom folosi functia searchAuthor dupa ce va fi gata.
for( m = 0; m < strlen(var); m++ )
if(!isalpha(var[m]))
return 0;
break;
case 5:
//citatul
if(strlen(var) == 0)
return 0;
printf("%d x \n", strlen(var));
}
var = strtok(NULL, ";"); //trecem la urmatorul sir de car separat de ;
k++;
}
}
j++; //trecem la urmatoarea linie
}
}
return 1;
}

k 只能得到 3,所以它只能得到数字、作者和日期。没有引用,也没有作者。所以我无法检查它们是否属实

最佳答案

这里:

string = var;
var2 = strtok(string, " ");

你遇到麻烦了。 strtok 忘记了它曾经有一个较长的字符串需要标记,现在它只记得之前返回的部分。您可以使用 strtok_r 同时标记不同的字符串。请阅读手册页以获取更多详细信息。

如果 strtok_r 不可用,在您的情况下,这将是在 case 3 的内部循环中进行解析而不使用 strtok 的最简单方法。由于预期的格式是严格的,因此按顺序检查这三个字段并不复杂。如果你敢的话,你还可以存储 strtok 插入缓冲区的 '\0' 字节的位置,并在内部循环之后,根据需要将它们替换为 ' ' 或 ';' ,并将重新修改的缓冲区再次提供给strtok。但这很容易出错,我强烈建议不要尝试这样做。

关于c - strtok 问题,它没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8648807/

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