Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问C函数外部的全局指针?_C - Fatal编程技术网

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

如何访问C函数外部的全局指针?,c,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) {

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

tkn++

而不是

*tkn++

您应该使用

tkn++

而不是

*tkn++

只需使用,而不是手动编码副本(提示-您忘记了字符串零终止符):

只需使用,而不是手动编码副本(提示-您忘记了字符串零终止符):

在这方面:

    while ((*tkn != 0) && (tkn != NULL))
你需要扭转这种状况。如果
tkn
是空指针,则在计算第一个术语时将崩溃。如果需要检查指针的有效性,请在取消引用它之前进行检查

    while (tkn != NULL && *tkn != '\0')
您添加的额外括号没有坏处,但不是必需的。虽然
0
是一个完美的零,但是
'\0'
强调
*tkn
是一个字符。当然,考虑到前面的
tkn!=如果if语句中的条件为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);
}
然后,我们可以使用(未经测试):

int main(无效)
{
字符缓冲区[2*MAX];
strcpy(缓冲区,“abc 3fc ghi”);
str=缓冲区;
标记化();
printf(“令牌=\n”,数组);/“abc”
str=NULL;
标记化();
printf(“令牌=\n”,数组);/“3fc”
str=NULL;
标记化();
printf(“令牌=\n”,数组);/“ghi”
返回(0);
}
显然,这取决于知道有三种代币。概括地说,您需要标记器来告诉您什么时候没有什么东西可以标记了

请注意,将
tkn
作为全局变量确实是不必要的-实际上,您应该尽可能避免全局变量。

在这一行中:

    while ((*tkn != 0) && (tkn != NULL))
你需要扭转这种状况。如果
tkn
是空指针,则在计算第一个术语时将崩溃。如果需要检查指针的有效性,请在取消引用它之前进行检查

    while (tkn != NULL && *tkn != '\0')
您添加的额外括号没有坏处,但不是必需的。虽然
0
是一个完美的零,但是
'\0'
强调
*tkn
是一个字符。当然,考虑到前面的
tkn!=如果if语句中的条件为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);
}
然后,我们可以使用(未经测试):

int main(无效)
{
字符缓冲区[2*MAX];
strcpy(缓冲区,“abc 3fc ghi”);
str=缓冲区;
标记化();
printf(“令牌=\n”,数组);/“abc”
str=NULL;
标记化();
printf(“令牌=\n”,数组);/“3fc”
str=NULL;
标记化();
printf(“令牌=\n”,数组);/“ghi”
返回(0);
}
显然,这取决于知道有三种代币。概括地说,您需要标记器来告诉您什么时候没有什么东西可以标记了


请注意,将
tkn
作为全局变量确实是不必要的-事实上,您应该尽可能避免全局变量。

尽管
tkn
本身是一个全局变量,但在尝试使用它时,您还必须确保它所指向的(即
*tkn
)仍然存在

当您使用如下行设置
tkn
时:

tkn = strtok (str," ");

然后
tkn
指向
str
指向的字符串部分。例如,如果
str
指向函数中声明的非静态数组,并且该函数已退出,则不再允许使用
*tkn
。如果
str
指向由
malloc()
分配的内存块,并且您在该内存上调用了
free()
,那么在该点之后不允许访问
*tkn

尽管
tkn
本身是一个全局变量,但您还必须确保它指向的内容(即
*tkn
)当你尝试使用它时,它仍然存在

当您使用如下行设置
tkn
时:

tkn = strtok (str," ");

然后
tkn
指向
str
指向的字符串部分。例如,如果
str
指向函数中声明的非静态数组,并且该函数已退出,则不再允许使用
*tkn
。如果
str
指向由
malloc()
分配的内存块,并且您在该内存上调用了
free()
,那么在该点之后不允许访问
*tkn

上述代码中没有
tkn2
。还有:什么是“工作不正常”?你期望的行为是什么?实际上发生了什么?哎呀,这应该是“tkn”,假设你在某个地方定义了
str
,我们看不见,而且它不是空的,就我所知,它应该能正常工作。然而,解释正在发生的事情以及解释您的期望会更有帮助。是的,我之前也定义了str。我只是将一个字符串解析为标记,然后希望分别引用每个标记并对每个标记进行处理。上面的代码中没有
tkn2
。还有:什么是“工作不正常”?你期望的行为是什么?实际上发生了什么?哎呀,这应该是“tkn”,假设你在某个地方定义了
str
,我们看不见,而且它不是空的,就我所知,它应该能正常工作。然而,解释正在发生的事情以及解释您的期望会更有帮助。是的,我之前也定义了str。我只是将一个字符串解析为标记,然后想分别引用每个标记并对每个标记进行处理。它在strtok(3)
中的静态存储中。尼古拉:不,它不是,它在