| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1100 人关注过本帖
标题:求助:实现linux下的tail程序,程序报"Segmentation fault"
只看楼主 加入收藏
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
求助:实现linux下的tail程序,程序报"Segmentation fault"
程序要求:
写一个简易的tail程序。命令行格式是tail -n, 将输出最后的n行,如果不加参数,默认输出最后的10行.

现在是程序可以实现功能,但会报错:
Segmentation fault.

编程环境:
debian linux
kernel 2.6.32.5
gcc version 4.4.5

代码如下:

程序代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXLINES 5000
#define MAXLEN 1000
#define ALLOCSIZE 10000
char *lineptr[MAXLINES];
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;
char *alloc(int n)
{
    if (allocbuf + ALLOCSIZE - allocp >= n) {
        allocp += n;
        return allocp - n;
    } else
        return 0;
}
int getl(char *s, int lim)
{
    int c, i;
    for (i = 0; i<lim-1 && (c=getchar()) != EOF && c!='\n'; ++i)
        s[i] = c;
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}
int readlines(char *lineptr[], int maxlines)
{
    int len, nlines;
    char *p, line[MAXLEN];
    nlines = 0;
    while ((len = getl(line, MAXLEN)) > 0)
        if (nlines >= maxlines || (p = alloc(len)) == NULL)
            return -1;
        else {
            line[len-1] = '\0';
            strcpy(p, line);
            lineptr[nlines++] = p;
        }
    return nlines;
}
void writelines(char *lineptr[], int nlines, int lastlines)
{
    int i;
    for (i = nlines - lastlines; i <= nlines; ++i)
        printf("%s\n", lineptr[i]);
}

main(int argc, char *argv[])
{
    int nlines, i, n;
    if (argc == 2 && (*++argv)[0] == '-') {
        for (i = 1; (*argv)[i] != '\0'; ++i) {
            if (!isdigit((*argv)[i])) {
                printf("error format 1.\n");
                return -1;
            }
        }
        n = atoi(&(*argv)[1]);
    } else if (argc == 1)
        n = 10;
    else
        printf("error format 2.\n");
    if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
        writelines(lineptr, nlines, n);
        return 0;
    } else {
        printf("error: input too big to print\n");
        return 1;
    }
}

==================================================

test是测试文件.
程序运行的输出如下:

程序代码:
xls@Debian:~/debian/code/c_programs$ cc 5-13.c -o tail1
xls@Debian:~/debian/code/c_programs$ cat test
11111111111111111111111111
2222222222222222222222222222
33333333333333333333333
444444444444444444444444444444444444
55555555555555555555
666666666666666666666666666666666
77777777777777777777777777777777777777777777777777777
88888888888888888888888888888
999999999999999
1010101010101010010101010101010
11  11  11 11 11
12  12 12 12 12
13 13 13 13
14 14 14 14 14 14 14
15 15 15 15 15 15 15 15
xls@Debian:~/debian/code/c_programs$ a.out -3 < test
13 13 13 13
14 14 14 14 14 14 14
15 15 15 15 15 15 15 15
Segmentation fault
xls@Debian:~/debian/code/c_programs$

请大家帮忙看一下为什么会有这个报错呢?
搜索更多相关主题的帖子: 编程 version linux 
2011-08-03 16:15
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
加上#include <stdlib.h>在Windows下的VC++6.0没错了

                                         
===========深入<----------------->浅出============
2011-08-03 16:35
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
肯定是哪个指针操作出错了~楼主自己调试下呗~

顺便问下楼主用什么东西调试?别跟我说 console + gdb
2011-08-03 17:00
zhiys
Rank: 2
等 级:论坛游民
帖 子:3
专家分:15
注 册:2011-8-3
收藏
得分:15 
问题出在  
void writelines(char *lineptr[], int nlines, int lastlines)
{
    int i;
    for (i = nlines - lastlines; i <= nlines; ++i)
        printf("%s\n", lineptr[i]);
}
改成  for( int i=nlines-lastlines ; i< nlines ; i++) 就好了
2011-08-03 17:39
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
收藏
得分:0 
回复 3楼 voidx
十分正确。
编辑器用vim,调试器用gdb,命令行操作。
当然我有图形界面的桌面啦~
2011-08-04 13:14
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
收藏
得分:0 
回复 4楼 zhiys

非常感谢zhiys。
这样改是对,没有报错了。
但是我有两个问题请教zhiys:
1.为什么多执行一步都会有报Segmentation fault?
2.你是怎么找到问题是出在这里的呢?或者说通过什么方法定位问题的呢?

我开gdb调试,到了
for (i = nlines - lastlines; i <= nlines; ++i)
这一行,就直接报错了,还是没法找到根本原因呢.
2011-08-04 13:24
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:5 
以下是引用xiaolaoshucj在2011-8-4 13:24:17的发言:


非常感谢zhiys。
这样改是对,没有报错了。
但是我有两个问题请教zhiys:
1.为什么多执行一步都会有报Segmentation fault?
2.你是怎么找到问题是出在这里的呢?或者说通过什么方法定位问题的呢?

我开gdb调试,到了
for (i = nlines - lastlines; i <= nlines; ++i)
这一行,就直接报错了,还是没法找到根本原因呢.


因为你会去读lineptr的越界地址。
比如定义buf[2], 你会去读buf+2的内容。
2011-08-04 14:50
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-08-04 14:51
xiaolaoshucj
Rank: 2
等 级:论坛游民
帖 子:26
专家分:15
注 册:2011-6-18
收藏
得分:0 
回复 7楼 Devil_W
恩,我了解了.刚才试了一下,当去读一个在程序中未定义的地址,即未分配存储空间的地址,就会出现Segmentation fault

P.S. 你的字体很漂亮.是什么字体?
2011-08-04 14:57
快速回复:求助:实现linux下的tail程序,程序报"Segmentation fault"
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041247 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved