我的代码中遇到了一个问题,我在使用一个指向内存的指针,我希望将其存储在一个我称之为Holder的数组中。该程序正在从标记为行的txt文件中读取数据。
Holder h;
Holder anArray[numberOfValues];
char* entry = malloc(160*sizeof(char));
int i = 0;
While(Something) {
If(x happens) {
char* p = strtok(entry,".") //Taking off part of a string based on a "."
h.firstpart = p;
p = strtok(NULL, " "); //Grab second part of string.
h.secondpart = p;
}
else {
anArray[i] = h;
i++;
}
我遇到的问题是h.firstpart和h.secondpart都将具有相同的值,因为它们只是指向某个东西而不是实际值本身。当它到达最后一个循环时,我在数组中的所有值都设置为最后一行的东西。
很抱歉,如果这张贴在其他地方,请链接我,如果是的话。我是C新秀,现在已经找了几个小时的工作。我假设我需要malloc更多的内存,并以某种方式将p指向的值放入该内存?我对如何为这个循环做这件事感到困惑。
这也是家庭作业,但他们希望我已经知道C,所以这个问题的背景并没有解决我的问题。
答案 0 :(得分:1)
由于entry
的内容被每一行覆盖,您需要将值复制到另一个位置。
最简单的方法是使用strdup
,它为以空字符结尾的字符串分配内存并复制它:
While(Something) {
If(x happens) {
char* p = strtok(entry,".") //Taking off part of a string based on a "."
h.firstpart = strdup(p);
p = strtok(NULL, " "); //Grab second part of string.
h.secondpart = strdup(p);
}
else {
anArray[i] = h;
i++;
}
strdup
在<string.h>
答案 1 :(得分:0)
警惕strtok。它修改了它正在检查的字符串。
假设您的entry
是从地址1000开始的一块内存,并且包含字符串“abcdef”
1000 1001 1002 1003 1004 1005 1006
a b c d e f g
entry == 1000
如果你这样做:
h.firstpart = strok(entry, "c");
然后strtok()
将使用'c'作为分隔符返回它找到的第一个标记。但它通过将'c'替换为NULL来实现这一点!!
1000 1001 1002 1003 1004 1005 1006
a b NULL d e f g
entry == 1000
h.firstpart == 1000 // "ab"
当你再次调用strtok
时,以NULL作为第一个参数,它返回下一个标记,再次用NULL替换分隔符。
h.secondpart = strtok(null, "f");
1000 1001 1002 1003 1004 1005 1006
a b NULL d e NULL g
entry == 1000
h.firstpart == 1000 // "ab"
h.secondpart == 1003 // "de"
因此,h.firstpart和h.secondpart是指向原始内存块的指针。它们并不相同。但strtok()
已将NULLS写入您的记忆中,这可能不是您想要的。
要解决这个问题,要么在让strtok
之前复制内存,要么使用与strtok不同的内容。