C:数组中的最后一个元素覆盖所有先前的项目

时间:2018-12-12 01:41:54

标签: c

首先,对于这是其他问题的重复,我深表歉意。我现在花了几个小时在玩耍,试图找出我的问题。由于我是C的新手,因此我可能没有使用正确的术语进行搜索。


我需要使用strtok分割文本并将每个值存储到一个结构中并将该结构存储在数组中。我需要使用malloc / realloc为数组的空间动态分配内存。

我面临的问题是我设置的最后一个值将覆盖数组中的所有先前值。在这一点上我完全迷失了。我在下面提供了我的问题的简短示例。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct textBit
{
    int textID;
    char** theWord;
    int randInt;
} TextBit;

void printTextBit(TextBit bit);

int main()
{
    int counter = 0;
    char myText[] = "hello this is a bunch of text i am just writing for an example to test something";
    TextBit** textBits;
    textBits = malloc(sizeof(TextBit) * 16);

    char* tok = strtok(myText, " ");
    while(tok != NULL)
    {
        TextBit temp;
        temp.textID = counter;
        temp.randInt = 25;

        char* tempWord = malloc(sizeof(char) * strlen(tok));
        strcpy(tempWord, tok);
        temp.theWord = &tempWord;

        printf("%d %s\n", counter, tok);
        //printTextBit(temp);

        textBits[counter] = &temp;

        counter++;
        tok = strtok(NULL, " ");
    }

    for(int i = 0; i < counter; i++)
    {
        printTextBit(*textBits[i]);
    }
}

void printTextBit(TextBit bit)
{
    printf("TextBit: %s (#%d) - %d\n", *bit.theWord, bit.textID, bit.randInt);
}

此代码输出:

0 hello
1 this
2 is
3 a
4 bunch
5 of
6 text
7 i
8 am
9 just
10 writing
11 for
12 an
13 example
14 to
15 test
16 something
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25
TextBit: something (#16) - 25

2 个答案:

答案 0 :(得分:1)

我认为您非常接近。最大的问题是temp和tempword的值不是您要分配的。它们很可能不会改变,但是内容会改变。同样,在不需要使用双指针的情况下,您也可以使用双指针。我将更改您的代码,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct textBit
{
    int textID;
    char* theWord;
    int randInt;
} TextBit;

void printTextBit(TextBit bit);

int main()
{
    int counter = 0;
    char myText[] = "hello this is a bunch of text i am just writing for an example to test something";
    TextBit* textBits;
    textBits = malloc(sizeof(TextBit) * 16);

    char* tok = strtok(myText, " ");
    while(tok != NULL)
    {
        TextBit *temp;
        temp = &textBits[counter];
        temp->textID = counter;
        temp->randInt = 25;
        temp->theWord = strdup(tok);

        printf("%d %s\n", counter, tok);
        //printTextBit(temp);

        counter++;
        tok = strtok(NULL, " ");
    }

    for(int i = 0; i < counter; i++) {
        printTextBit(textBits[i]);
    }
}

void printTextBit(TextBit bit)
{
    printf("TextBit: %s (#%d) - %d\n", bit.theWord, bit.textID, bit.randInt);
}

使用strdup会将单词复制到您的结构中。您可以分别使用malloc和strcpy,但strdup可以同时使用一行。另外,此代码使用temp指向textBits数组。

答案 1 :(得分:1)

主要问题是所有条目都使用tok指向的相同地址。建议在将单词添加到数组时使用:strdup()(当然,还要检查结果是否为!= NULL以确保操作成功),然后将返回值分配给数组