我试图在我的程序中的不同函数中访问*tkn
的数据,例如:putchar(*tkn);
它是一个全局变量,但它无法正常工作。有什么想法吗?
#define MAX 20
// globals
char *tkn;
char array[MAX];
...
void tokenize()
{
int i = 0, j = 0;
char *delim = " ";
tkn = strtok (str," "); // get token 1
if (tkn != NULL) {
printf("token1: ");
while ((*tkn != 0) && (tkn != NULL))
{
putchar(*tkn);
array[i] = *tkn;
*tkn++;
i++;
}
}
}
答案 0 :(得分:2)
在这一行:
while ((*tkn != 0) && (tkn != NULL))
你需要扭转这些条件。如果tkn
是空指针,则在评估第一个术语时会崩溃。如果需要检查指针的有效性,请在解除引用之前执行此操作。
while (tkn != NULL && *tkn != '\0')
您添加的额外括号不会造成伤害,但不是必需的。虽然0
是一个非常好的零,但'\0'
强调*tkn
是一个字符。当然,鉴于if语句中的先前tkn != NULL
条件,没有必要在while循环中重复检查。
基于你的工作代码 - 一些工作要留给字符串中的后续标记,例如......
#include <stdlib.h>
#include <string.h>
enum { MAX = 20 };
char *tkn;
char array[MAX];
char str[2*MAX];
void tokenize(void)
{
int i = 0;
array[0] = '\0';
tkn = strtok(str, " "); // get token 1
if (tkn != NULL)
{
printf("token1: ");
while (tkn != NULL && *tkn != '\0' && i < MAX - 1)
{
putchar(*tkn);
array[i++] = *tkn++;
}
*tkn = '\0';
putchar('\n');
}
}
int main(void)
{
strcpy(str, "abc def");
tokenize();
printf("token = <<%s>>\n", array);
strcpy(str, "abcdefghijklmnopqrstuvwxyz");
tokenize();
printf("token = <<%s>>\n", array);
return(0);
}
示例输出:
token1: abc
token = <<abc>>
token1: abcdefghijklmnopqrs
token = <<abcdefghijklmnopqrs>>
问:
但是,如果我正在接受一个字符串'abc 3fc ghi'并且我想在另一个函数中使用'3fc',将其从ascii转换为十六进制怎么办?我如何使用say tkn2 for 3fc并仅使用指针获取? - 帕特里克9分钟前
因为strtok()
有一个适度恶劣的界面,所以它变得更加棘手。
保持tokenize()
不变,让我们重新定义str
:
char *str;
然后,我们可以使用(未经测试):
int main(void)
{
char buffer[2*MAX];
strcpy(buffer, "abc 3fc ghi");
str = buffer;
tokenize();
printf("token = <<%s>>\n", array); // "abc"
str = NULL;
tokenize();
printf("token = <<%s>>\n", array); // "3fc"
str = NULL;
tokenize();
printf("token = <<%s>>\n", array); // "ghi"
return(0);
}
显然,这依赖于知道有三个令牌。为了概括,您需要使用标记生成器告诉您何时没有任何内容可以进行标记化。
请注意,将tkn
作为全局变量实际上是不必要的 - 实际上,您应该尽可能地避免使用全局变量。
答案 1 :(得分:1)
你应该使用
TKN ++
而不是
* TKN ++
答案 2 :(得分:0)
只需使用strlcpy(3)
而不是手工编写副本(提示 - 您忘记了字符串零终结符):
strlcpy( array, tkn, MAX );
答案 3 :(得分:0)
虽然tkn
本身是一个全局变量,但您还必须确保它指向的内容(即*tkn
)在您尝试使用时仍然存在它
使用以下行设置tkn
时
tkn = strtok (str," ");
然后tkn
指向str
指向的字符串的一部分。因此,如果str
指向函数中声明的非静态数组,并且该函数已退出 - 则不再允许*tkn
。如果str
指向由malloc()
分配的内存块,并且您在该内存上调用了free()
,则在该点之后不允许访问*tkn
。