我下载了一个文本文件,我想读取一行,删除前导和跟踪空白,并将更新的(新)行写入另一个文件。我确信有更多有说服力的方法,但我试图这样做:
char *make_dst( char *src, int beg, int end ) {
char *dst = ( char * )malloc( MAXLEN * sizeof( char ));
int i = 0;
if( dst != NULL ) {
while( beg <= end ) {
/* this works fine */
dst[i] = src[beg];
i++;
beg++;
/* this causes the segmentation fault */
dst[i] = src[i + beg];
i++;
}
dst[i] = '\0';
return dst;
}
我不明白为什么第二种方式造成错误?有人可以帮我解释一下吗?我正在使用lubuntu 14.04 - 这是一个操作系统吗?我认为以这种方式使用“math”引用数组中的不同索引是好的吗?
答案 0 :(得分:3)
while( beg <= end ) {
dst[i] = src[beg];
i++;
beg++;
}
这是正确的,因为您推进i
和beg
并确保beg <= end
。
while( beg <= end ) {
dst[i] = src[i + beg];
i++;
}
在这种情况下,你有一个无限循环,因为如果最初beg <= end
为真,那么在N次迭代后它总是为真,因为永远不会修改beg
的值。
要纠正它,条件必须确保i + beg <= end
(这假设你想要[开始,结束]范围而不是[开始,结束],这本身并没有错误。)
[begin, end)
范围的优点是可以方便地指定基数
[x, x + 10)
表示您的尺寸范围为10
。等价物是[x, x + 10 - 1]
。
您希望范围的大小为简单end - begin
,并且您希望包含下限。 [begin, end]
表示你需要对空范围进行特殊处理,这会产生很多噪音(-1,+ 1,你知道那种)。
答案 1 :(得分:0)
the following code will go the job
char *make_dst( char *src, int beg, int end )
{
int i = 0;
char *dst = malloc( MAXLEN);
if( NULL == dst )
{ // then malloc failed
perror( "malloc failed" );
exit( EXIT_FAILURE );
}
// implied else, malloc successful
memset( dst, 0x00, MAXLEN );
for( i=0, i<(end-beg+1); i++ )
{
dst[i] = src[beg++];
} // end for
return dst;
} // end function: make_dst