- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个读取格式化文件的函数。它看起来像这样:
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/
我正在寻找将数组中的单词与另一个数组中的字典中的单词进行比较,以查找找到的最大单词数 我使用了 strtok,因为两者中的单词都是用空格分隔的,但它不起作用。我需要你的帮助,请 void cherc
我在这个程序上花了几个小时,并花了几个小时在网上搜索我的方法的替代方案,但整个晚上都被崩溃和错误所困扰…… 我有几件事想用这段代码实现。首先我会解释我的问题,然后我会发布代码,最后我会解释我对这个程序
我希望使用 strtok() 解析以下字符串。 DINNER;NME=Tom Johnson;ADRES=1234 Street;TIME="12:00","15:00":Formal 有没有一种方法
这个问题在这里已经有了答案: Nested strtok function problem in C [duplicate] (2 个答案) 关闭 6 年前。 我意识到标题令人困惑,想不出更清晰的措
只是为了好玩,我正在编写一个程序,它将接受用户输入的字符串(甚至可能是文本文档)并打乱字符串中的单词。 我正在尝试使用 strtok 函数来分隔字符串中的每个单词。目前我觉得我当前的 strtok 实
如果我欺骗了主题,我真的很抱歉,我在这里搜索它没有结果。 我有代码 void split(char* str, char* splitstr) { char* p; char sp
strtok() 函数使用静态变量。 因此它不是可重入的。并且不能用于解析多个字符串。 我想知道的是为什么 strtok() 是这样设计的? strtok_r() 应该是 strtok()。 这个函数
我是 C 编程的新手,目前正在努力使用 strtok。我想使用以下代码将一个字符串拆分为两个字符串(字符串是例如“Bat1:185”,分隔符是冒号): char batName[13]; char b
我正在写一个 C 程序来研究函数的用法 strtok() .这是我的代码: #include #include main() { char abc[100] = "ls &"; c
我正在尝试分割以下类型的行: GM 1 2 3 ! this is a comment 分离出评论部分。有几种可能的注释分隔符:!、' 和 #。 strtok 是明显的解决方案: card->card
我需要将 C 字符串划分为标记。我认为 strtok 将是我最好的尝试,但我得到了非常奇怪的结果...... 这是我的测试程序。在这个例子中,我将得到 3 个带有“##”分隔符的 token ,但是当
我正在使用库的 strtok(...) 并且它似乎工作正常,直到结束条件,导致段错误和程序崩溃。 API 声称 strtok(...) 将在找不到更多标记时输出 NULL,这意味着,我认为,您必须捕获
我有包含歌曲详细信息的链接列表,想要比较两个歌曲名称...附加任务是通过比不同单词更多的相似单词来比较它们...我使用 strtok 逐字获取它,然后检查如果当前单词包含在另一个名称中...但是当我这
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我尝试编写一个函数,该函数获取指向字符数组的指针,从用户读取字符串并删除字符串开头的所有空格,直到出现第一个不是字符串的字符。最后返回开头不带空格的字符串副本。 例如, 对于输入abcd,函数应返回指
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
当我尝试分离 token “(555) 333-444”时,下面的代码没有给出所需的输出。我需要函数来分别分离所有这些 555、333、444。我的错误可能是什么? 输出: 555 333-444 #
这个问题已经有答案了: How does strtok() split the string into tokens in C? (16 个回答) 已关闭 7 年前。 抱歉,这可能是一个愚蠢的问题,但
#include #include #include #define MAX_INPUT_LENGTH 1024 char *readline(FILE* fp, int max_length)
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是一名优秀的程序员,十分优秀!