我想在以下方面获得帮助:
void Traceroute (char * hops[]){
char* line = NULL;
size_t len = 0;
ssize_t read;
int i = 0;
while ((read = getline(&line, &len, fp)) != -1) {
hops[i] = line;
i++;
}
printf ("value1: %s value2: %s\n",hops[0],hops[1]);
}
我实际获得的是数组中添加的最新值。!!酒花 我主要尝试定义:
char* out[10]
并传递它,但同样我总是得到相同的输出。 有什么建议 ?? 如果你能帮助我,请问如何从函数中返回char **?
***我不想使用字符串
提前致谢。
答案 0 :(得分:1)
除了不为line
分配内存之外,你正在这行做一个所谓的浅拷贝:
hops[i] = line;
这意味着您将指针line
的值复制到hops[i]
,因此在循环结束时,hops
的所有元素都指向同一位置在记忆中:line
指向的地方。
您需要的是深层复印件。假设您在调用hops
之前为Traceroute
分配了内存,则可以使用strcpy
:
strcpy(hops[i], line);
因为您不想使用std::string
。
再次,回到开始,您需要为line
分配足够的内存,以便能够保存一行文件。类似的东西:
line = (char *) malloc(MAX_LINE_LENGTH);
然后,在你的函数的最后:
free(line);
编辑:为hops
添加内存分配:
我假设你想在Traceroute
之外做这件事。因此,在调用该函数之前,请使用:
int i = 0;
const int nlines = 10;
char *hops[nlines];
for(i = 0; i < nlines; ++i)
hops[i] = (char *) malloc(MAX_LINE_LENGTH);
然后,当你完成数组hops
时,你需要释放内存:
for(i = 0; i < nlines; ++i)
free(hops[i]);
答案 1 :(得分:0)
char* out[10]
仅为10个字符指针分配空间。您将每一行读入同一位置(line
),并将该指针指定给数组的每个元素,因此它们都是相同的。但是你实际上从来没有为这条线留出空间,更不用说每条线的空间,这意味着你要求麻烦。
答案 2 :(得分:0)
您想要动态分配和复制每个char序列:
因此:
hops[i] = line;
变为:
size_t nSize = sizeof(char) * read; //Get the byte size of the data
hops[i] = malloc(nSize); //Allocate the proper number of chars
memcpy(hops[i], line, nSize); //Copy the data to that hops entry
这是因为线路上的数据会在循环的每次迭代中被覆盖,并且由于hops [i]指向同一区域,hops [i]处的数据会被覆盖。
答案 3 :(得分:0)
getline
函数可以为您分配内存,但如果您在每次调用之前将line
设置为NULL并将len
设置为0,则仅。所以Traceroute
函数看起来应该是这样的
int Traceroute( char *hops[], int size )
{
char *line;
size_t len;
int i;
for ( i = 0; i < size; i++ )
{
line = NULL;
len = 0;
if ( getline( &line, &len, fp ) < 0 )
break;
hops[i] = line;
}
return i;
}
应该像这样调用
int main( void )
{
char *hops[10];
int count = Traceroute( hops, 10 );
for ( int i = 0; i < count; i++ )
printf( "%s", hops[i] );
}