如何初始化数组并用缓冲区中的字符填充?

时间:2015-04-28 21:46:58

标签: c arrays

我有以下方法:

int create_nodes(Source* source, int maxTokens) {
    int nodeCount = 0;
    Token* p_Tstart = source->tknBuffer;
    Token* p_Tcurrent = source->tknBuffer;

    while ((p_Tcurrent - p_Tstart) < maxTokens && p_Tcurrent != NULL) {
        int szWord = p_Tcurrent->t_L;
        char word[szWord];
        //  void *memset(void *str, int c, size_t n)
        memset(word, '\0', sizeof(char)*szWord);
        //  void *memcpy(void *str1, const void *str2, size_t n)
        char* p_T = source->buffer + p_Tcurrent->t_S;
        memcpy(word, p_T, szWord);

        if (word == ";") {
            ++p_Tcurrent;

            continue;
        }

        ++p_Tcurrent;
        ++nodeCount;
    }
}

source包含char*缓冲区。该方法的目的是首先计算缓冲区中不是;标记的所有标记(并且到达我们将需要多少个节点)。这是我正在使用的缓冲区:11 + 31;。令牌 - 就此而言 - 创建如下:

  • 11
  • +
  • 31
  • ;

我传入token*,其中包含一个开头(t_S)和一个长度(t_L)。因此,例如,代表+字符的标记:

  • t->t_S = 3
  • t->t_L = 1

memcpy(...),调试器会跳转到++p_Tcurrent,这意味着没有任何内容被复制到word - 这实际上是一个未被捕获的异常。我在初始化单词数组时做错了什么?然后用令牌指定的特定信息填充它?

source.h

struct source {
    const char* fileName;
    char* buffer;
    int bufLen;
    Token* tknBuffer;
    Node* nodeBuffer;
    Expression* exprBuffer;
};  

token.h

struct token {
    int t_S;
    int t_L;
};

1 个答案:

答案 0 :(得分:1)

这不对。

if (word == ";") {

这将比较两个指针,并且很可能一直都是假的。

我怀疑你打算使用:

// Test whether the first character is a semicolon
if (word[0] == ';') {

// Test whether the entire word is a semicolon
if (strcmp(word, ";") == 0) {