该计划旨在获得第一个单词和一系列剩余单词。例如,如果line = "a bb cc dd ee"
,则key
应为a
,keySet
应为指向{bb,cc,dd,ee}
数组的指针。
我尝试动态地将内存分配给char** keySet
,但keySet输出始终为ee ee ee ee
。似乎keySet不是指向数组的第一个元素的指针,而是指向最后一个元素。我的功能有什么问题?
void allocateKeySet(char* line){
int count = 0;
char* token = strtok(line, " ");
char key[17];
char tempKey[17];
char** keySet;
sscanf(strtok(NULL, " "), " %s", key);
keySet = calloc(1, sizeof(char*));
while((token = strtok(NULL, " ")) != NULL){
sscanf(token, " %s", tempKey);
keySet[count++] = tempKey;
keySet = realloc(keySet, (count+2) * sizeof(char*));
}
printf("key: %s\n", key);
printf("keySet: ");
for(int i = 0; i < count - 1; i++){
printf("%s ", keySet[i]);
}
}
e.g。 行:
"a bb cc dd ee"
预期产出:
key: a
keySet: bb cc dd ee
我的输出:
key: a
keySet: ee ee ee ee
答案 0 :(得分:1)
keySet[count++] = tempKey;
:您可能需要str(n)cpy
或strdup
。目前,tempKey
每次都会重新分配,所有keySet
元素都指向相同的 tempKey
。因此,在上一次tempKey
分配后,它们都指向"ee"
。 (请注意,如果您使用strcpy
,则需要先为keySet[count++]
分配内存; strdup
一次性完成分配和分配,但您必须测试{之后{1}}。)
因此:
NULL
如果您无法使用while((token = strtok(NULL, " ")) != NULL){
sscanf(token, " %s", tempKey);
keySet[count] = strdup(tempKey);
if (keySet[count] == NULL) {
perror("memory allocation failure");
}
count++;
keySet = realloc(keySet, (count+2) * sizeof(char*));
}
,则可以使用以下行代替strdup
行:
strdup
根据this answer。
不要忘记随后释放单个keySet[count] = malloc(strlen(tempKey)+1);
// test for keySet[count] 1= NULL
strcpy(keySet[count], tempKey)
count++;
元素。