C 每行仅从strtok()获得2个令牌
我正在尝试从输入文件生成令牌。因此,我用fgets获取一行,并将其提供给一个helper方法,该方法接受一个char*并返回令牌的一个char*。我正在使用分隔符为“”的strtok(),因为标记都由“”分隔。但是,我不明白为什么代码每行只生成2个标记,而只移动到下一行,即使该行中还有更多需要标记。代码如下:C 每行仅从strtok()获得2个令牌,c,C,我正在尝试从输入文件生成令牌。因此,我用fgets获取一行,并将其提供给一个helper方法,该方法接受一个char*并返回令牌的一个char*。我正在使用分隔符为“”的strtok(),因为标记都由“”分隔。但是,我不明白为什么代码每行只生成2个标记,而只移动到下一行,即使该行中还有更多需要标记。代码如下: char *TKGetNextToken( char * start ) { /* fill in your code here */ printf("Entered TK
char *TKGetNextToken( char * start ) {
/* fill in your code here */
printf("Entered TKGetNextToken \n");
printf(&start[0]);
char* temp = &start[0];
//Delimiters for the tokens
const char* delim = " ";
//store tempToken
char* tempTok = strtok(temp, delim);
//return the token
return tempTok;
}
下面是我在main方法中存储令牌的方式:
//call get next token and get the token and store into temptok
while (temp!= NULL) {
tempTok = TKGetNextToken(temp);
printf("tempTok: %s\n",tempTok);
token.charPtr[tempNum] = tempTok;
tempNum++;
printf("Temp: %s\n",tempTok);
temp = strtok(NULL, " \0\n");
}
因此,假设我有一个file.txt,其中包含:
abcd ef ghij asf32
fsadf ads adf
创建的标记将是“abcd”和“ef”,它将继续到下一行,而不为“ghij”和“asf32”创建标记。使用正确的语法进行strtok
char *tempTok = strtok(line, " "); //initialize
while (tempTok != NULL) {
//do the work
tempTok = strtok(NULL, " \n"); //update
}
如果您确实喜欢上面的内容,那么您可以很容易地获得代币。请看一看这个例子,它类似于您的代码,只要记住如何正确使用,它就会工作。查看strtok
以及它在循环中的使用,更新和使用char*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE *fp = fopen("data.txt", "r");
char line[256];
while (fgets(line, sizeof(line), fp)) {
char *tempTok = strtok(line, " ");
while (tempTok != NULL) {
printf("token %s\n", tempTok);
tempTok = strtok(NULL, " \n");
}
}
fclose(fp);
return 0;
}
输出
./a.out
token abcd
token ef
token ghij
token asf32
token fsadf
token ads
token adf
对strtok使用正确的语法
char *tempTok = strtok(line, " "); //initialize
while (tempTok != NULL) {
//do the work
tempTok = strtok(NULL, " \n"); //update
}
如果您确实喜欢上面的内容,那么您可以很容易地获得代币。请看一看这个例子,它类似于您的代码,只要记住如何正确使用,它就会工作。查看strtok
以及它在循环中的使用,更新和使用char*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE *fp = fopen("data.txt", "r");
char line[256];
while (fgets(line, sizeof(line), fp)) {
char *tempTok = strtok(line, " ");
while (tempTok != NULL) {
printf("token %s\n", tempTok);
tempTok = strtok(NULL, " \n");
}
}
fclose(fp);
return 0;
}
输出
./a.out
token abcd
token ef
token ghij
token asf32
token fsadf
token ads
token adf
注意:C不支持方法,只支持函数和
printf(&start[0])代码>是一个明确的禁止!永远不要将usafe数据作为格式字符串传递!这是最典型的恶意软件入口点之一(也是最容易避免的)。您在函数和调用者的同一字符串上调用strtok
。嗯,有点。它实际上是对同一字符串的NULL和non-NULLstrtok
调用的混合体。更糟糕的是。这几乎肯定不是你想要的。要更详细地了解正在发生的情况,建议您使用调试器。您接近于一个调试器,但缺少了main
中的一些重要代码。张贴MCVE使问题更容易回答。也就是说,答案是完全删除TKGetNextToken
函数,因此您需要解释该函数存在的原因以及它的有用性。注意:C不支持方法,只支持函数。和printf(&start[0])代码>是一个明确的禁止!永远不要将usafe数据作为格式字符串传递!这是最典型的恶意软件入口点之一(也是最容易避免的)。您在函数和调用者的同一字符串上调用strtok
。嗯,有点。它实际上是对同一字符串的NULL和non-NULLstrtok
调用的混合体。更糟糕的是。这几乎肯定不是你想要的。要更详细地了解正在发生的情况,建议您使用调试器。您接近于一个调试器,但缺少了main
中的一些重要代码。张贴MCVE使问题更容易回答。也就是说,答案将是完全删除TKGetNextToken
函数,因此您需要解释该函数存在的原因及其有用性。我还将从分隔符列表中删除\0
。原因有二。(1) strtok
将始终在\0
处停止,因为这是字符串的结尾。(2) 当您在分隔符中放入\0
时,之后的所有内容都将被忽略,因为\0
终止分隔符列表。这就是为什么在asf32
后面有一个空行:分隔符中的\n
被忽略。我还将从分隔符列表中删除\0
。原因有二。(1) strtok
将始终在\0
处停止,因为这是字符串的结尾。(2) 当您在分隔符中放入\0
时,之后的所有内容都将被忽略,因为\0
终止分隔符列表。这就是为什么在asf32
后面有一个空行:分隔符中的\n
被忽略。