如何访问C函数之外的全局指针?

时间:2010-04-13 03:16:55

标签: c

我试图在我的程序中的不同函数中访问*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++;
    }
   }                
}

4 个答案:

答案 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