导致分段错误的语法?

时间:2014-12-22 20:55:23

标签: c

我下载了一个文本文件,我想读取一行,删除前导和跟踪空白,并将更新的(新)行写入另一个文件。我确信有更多有说服力的方法,但我试图这样做:

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”引用数组中的不同索引是好的吗?

2 个答案:

答案 0 :(得分:3)

while( beg <= end ) {
    dst[i] = src[beg];
    i++;
    beg++;
}

这是正确的,因为您推进ibeg并确保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