【发布时间】:2016-07-17 20:36:55
【问题描述】:
我正在尝试从输入文件中制作令牌。因此,我得到一行 fgets 并将其提供给一个辅助方法,该方法接受一个 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”创建标记。
【问题讨论】:
-
注意:C不支持方法,只支持函数。
-
而
printf(&start[0]);显然是不行的! 从不将 usafe 数据作为格式字符串传递!这是最典型的恶意软件入口点之一(也是最容易避免的)。 -
你在函数和调用者的同一个字符串上调用
strtok。嗯,有点。它实际上是对同一字符串的 NULL 和非 NULLstrtok调用的混合。更糟糕的是。这几乎肯定不是你想要的。要更详细地了解正在发生的事情,建议您使用调试器。 -
您已接近minimal, complete, and verifiable example (MCVE),但您缺少
main中的一些重要代码。发布 MCVE 使问题更容易回答。也就是说,答案将是完全删除TKGetNextToken函数,因此您需要解释为什么该函数存在,以及它为什么有用。
标签: c