首先,对于这是其他问题的重复,我深表歉意。我现在花了几个小时在玩耍,试图找出我的问题。由于我是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
答案 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以确保操作成功),然后将返回值分配给数组