运行时错误:分段错误(核心转储)

时间:2014-09-09 13:30:18

标签: c segmentation-fault

我正在尝试编写一个程序,从输入行中删除尾随空格/制表符(练习1-18来自K& R)。

/* Write a program to remove trailing blanks and tabs from each
line of input, and to delete entirely blank lines. */

#include <stdio.h>
#define MAXLINE 1000

int gettline(char s[], int lim);

main()
{
    int len, i;
    char line[MAXLINE];
    while ((len = gettline(line, MAXLINE)) > 0)
        for(i=0; i<len-1; ++i){
            if (line[i]!= ' ' && line[i]!='\t')
                printf("%s", line[i]);
        }
    printf("\n");   
    return 0;
}

/* gettline: read a line into s, return length */
int gettline(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;
}

当我运行它时,我收到错误Segmentation fault (core dumped)。我查看了其他一些具有相同主题的问题(1234,..),但它们对我的级别来说过于复杂。我只知道错误意味着我试图访问我不允许的部分内存。我不确定在我的案件中究竟发生了什么

1 个答案:

答案 0 :(得分:3)

seg故障的原因应该是:

    for(i=0; i<len-1; ++i){
        if (line[i]!= ' ' && line[i]!='\t')
            printf("%s", line[i]); 
    }

由于%sprintf()需要char *参数,但您传递的是一个字符。 将其更改为printf( "%c", line[i] );,它应该运行。

<强>但是 它仍然不会按你所说的去做(&#34;删除尾随空格/标签&#34;),因为你不会打印任何空格或标签,&# #34; Hello World&#34;将成为&#34; HelloWorld&#34;