C 每行仅从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

我正在尝试从输入文件生成令牌。因此,我用fgets获取一行,并将其提供给一个helper方法,该方法接受一个char*并返回令牌的一个char*。我正在使用分隔符为“”的strtok(),因为标记都由“”分隔。但是,我不明白为什么代码每行只生成2个标记,而只移动到下一行,即使该行中还有更多需要标记。代码如下:

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-NULL
strtok
调用的混合体。更糟糕的是。这几乎肯定不是你想要的。要更详细地了解正在发生的情况,建议您使用调试器。您接近于一个调试器,但缺少了
main
中的一些重要代码。张贴MCVE使问题更容易回答。也就是说,答案是完全删除
TKGetNextToken
函数,因此您需要解释该函数存在的原因以及它的有用性。注意:C不支持方法,只支持函数。和
printf(&start[0])是一个明确的禁止!永远不要将usafe数据作为格式字符串传递!这是最典型的恶意软件入口点之一(也是最容易避免的)。您在函数和调用者的同一字符串上调用
strtok
。嗯,有点。它实际上是对同一字符串的NULL和non-NULL
strtok
调用的混合体。更糟糕的是。这几乎肯定不是你想要的。要更详细地了解正在发生的情况,建议您使用调试器。您接近于一个调试器,但缺少了
main
中的一些重要代码。张贴MCVE使问题更容易回答。也就是说,答案将是完全删除
TKGetNextToken
函数,因此您需要解释该函数存在的原因及其有用性。我还将从分隔符列表中删除
\0
。原因有二。(1)
strtok
将始终在
\0
处停止,因为这是字符串的结尾。(2) 当您在分隔符中放入
\0
时,之后的所有内容都将被忽略,因为
\0
终止分隔符列表。这就是为什么在
asf32
后面有一个空行:分隔符中的
\n
被忽略。我还将从分隔符列表中删除
\0
。原因有二。(1)
strtok
将始终在
\0
处停止,因为这是字符串的结尾。(2) 当您在分隔符中放入
\0
时,之后的所有内容都将被忽略,因为
\0
终止分隔符列表。这就是为什么在
asf32
后面有一个空行:分隔符中的
\n
被忽略。