我有类似的东西(没有间距问题),我正在读取一个文件,其中包含由#
符号分隔的字符串,并尝试将每个字符串读取为{{1 }}秒。但是,每个包含字符串的char *
都是字符串的确切长度。这虽然是一个小小的车。
char*
思想?
答案 0 :(得分:2)
您的问题是您正在重复使用entry
数组。
了解我们i
fragments[i++] = entry;
的所有temp
。最后,每个片段都将指向同一个地方,因此将包含相同的字符串(在这种情况下,它将是最后读取的字符串)。
好像你试图通过使用entry
和fscanf
数组来解决这个问题,但最后你也可能直接写entry
到fragments
数组。
你可以得到的另一个问题是你的指针指向一个在堆栈上自动分配的数组(即:在函数内声明的数组)。函数返回后,程序会重用这些内存位置,指针可以开始指向无效数据(因为这是C,使用这些损坏的字符串会导致各种崩溃和错误的程序行为)。
你的问题基本上是一个内存分配问题,所以有很多解决方案。
使char fragments[2000][20]; //can hold 2000 19-character strings
for(i=0; i<N; i++){
scanf("%d", fragments[i]);
}
成为字符数组的数组(而不仅仅是指针)。这样你就可以为每个字符串安全地使用不同的内存。
malloc
此解决方案的优点是简单,并且所有内存都是事先分配的。
使用char* fragments[2000];
char entry[MAX_FRAGMENT_LENGTH]; //temporary buffer for strings
for(i=0; i<N; i++){
scanf("%d", entry[i]);
//dynamically allocate an array, just big enough to fit our string in.
fragments[i] = malloc(sizeof(char) * (1 + strlen(entry));
strcpy(fragments[i], entry);
}
分配动态内存。这允许您为每个字符串选择不同大小的数组,并允许您在运行时而不是编译时选择数组的大小。
free
这种方法的主要优点是它非常灵活,同时仍然相当简单。主要的不足之处在于,在完成这些指针后,您需要malloc
所有已经char buffer[2000*20];
char* fragments[2000];
char* next_empty_location = buffer;
for(i=0; i<N; i++){
scanf("%d", next_empty_location);
fragments[i] = next_empty_location;
next_empty_location += strlen(next_empty_location) + 1;
}
的指针(否则可能会导致内存泄漏)。
手动执行“动态分配”,使用单个大缓冲区来包含所有字符串。
malloc
如果你不能/不希望/不允许使用{{1}}解决方案,那么这就是最接近的。它可能更难理解(如果你遇到C问题),但最好似乎适合模糊的“每个字符串*保存字符串很多是字符串的确切长度”限制。