1

我在编译器的词法分析中遇到了一些问题,我声明了以下指针

char *words[29]={
        "program",
        "label",
        "integer",
        "word",
        "char",
        "byte",
        "shortint",
        "logint",
        "real",
        "single",
        "double",
        "string",
        "boolean",
        "var",
        "procedure",
        "function",
        "begin",
        "end",
        "if",
        "then",
        "else",
        "or",
        "and",
        "div",
        "not",
        "do",
        "while",
        "mod"
};
char message[30];

然后我尝试在函数中使用它

            for(handle=0;(&words[handle] != NULL);handle++)
            {
                message = &words[handle];
                if(!strcmp(token,message))
                    message='words';
            }

但是我在尝试执行时收到以下错误:

关于 (line message = &words[handle];) : 警告 C4047: '=' : 'char [30]' 与 'char ** ' 的间接级别不同

关于 (line message = &words[handle];) : 错误 C2106: '=' : 左操作数必须是左值

关于 (line message='words';) : error C2015: too many characters in constant

关于(line message='words';):错误 C2106:'=':左操作数必须是左值

我不能那样使用指针吗?你有什么建议吗?

4

3 回答 3

3

三件事:

  1. 与号 ( &) 是无关的。的类型words[handle]char *,即字符串,所以你有你需要的东西。你不需要拿那个地址char *

  2. 您不能直接分配给messagewith,=因为它是一个数组。C 不是一门非常花哨的语言。您可以更改messagechar *message,因此它是指针而不是数组;或者您可以使用该strcpy(dst, src)功能复制到它,如下所示strcpy(message, "words")

  3. 您的for循环NULL在数组中查找一个指针,words因此它知道何时停止——但您NULL在数组中没有!你需要添加NULL到最后。正如所写的那样,只有常规字符串,因此循环永远不会找到它正在寻找的空指针,并且会进入未知的内存区域。

希望有帮助!

于 2009-06-24T01:36:48.650 回答
3

你有很多错误:

  • 代替 &words[handle],使用 words[handle]
  • 你想通过 message = 'words' 做什么?这里至少有3个错误:字符串使用双引号,而不是单引号;message 是一个常数,你不能改变它;要复制字符串,您需要使用 strcpy(),而不仅仅是 = 运算符
  • 如果字符串相等,strcmp() 返回 0;你需要颠倒你的逻辑
  • 您忘记在数组末尾包含 NULL
于 2009-06-24T01:39:50.423 回答
2

您的代码存在许多问题。首先,您应该将关键字数组声明为const char *words[]. char *将字符串常量声明为不带const;是不好的做法 只允许遗留代码仍然可以编译。

您不应该在声明中指定 29 的数组大小,因为它很脆弱。您应该只使用空括号并让编译器计算出数组大小。你可以通过做得到数组的大小,sizeof(words)/sizeof(words[0])即使你添加或删除元素,它仍然是正确的words

接下来,您的for循环永远不会终止(尽管它几乎肯定会在某些时候出现段错误)。取一个值的地址永远不会产生空指针,所以&words[handle] != NULL总是正确的。遍历循环的正确方法是只计算条目数:

for(handle = 0; handle < sizeof(words)/sizeof(words[0]); handle++)

message被声明为一个字符数组。数组不可赋值,即它们不是左值。如果要分配给数组,则必须使用诸如strcpy()(不推荐,除非在某些情况下,由于潜在的缓冲区溢出)、、、strncpy()memcpy()strncpy_s()仅在 Windows 上可用)之类的东西显式地将数据复制到其中。

但是,在这种情况下,您根本不需要数组——您只想分配一个指针。message改为声明const char *message正确声明后,您将执行以下操作:

const char *message;
...
message = words[handle];
if(!strcmp(token, message))
    message = "words";

在最后的语句中,您应该使用双引号words将其设为字符串常量。单引号用于单字符常量(例如'A')。尽管它们在技术上可以包含多个字符,但生成的整数常量的字节顺序是实现定义的,在这种情况下它们不是您想要的。

我也不太确定你想用这message = "words";条线做什么。如果你想对words变量做一些聪明的把戏,现在就停下来,它是行不通的。C没有任何形式的反射。

于 2009-06-24T01:42:02.477 回答