C - 命令历史(核心转储)

时间:2017-06-15 00:13:57

标签: c linux file ubuntu

我正在尝试删除file1的第20行。该程序的其余部分是一个简单的shell,只能工作我不能创建用户使用的命令的历史记录。 我尝试插入命令时出现的错误消息是:Segmentation fault (core dumped)

我正在执行的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

#define GetCurrentDir getcwd  //get the path of file
#define BUFFER_LEN 1024

int ch;
FILE *file1, file2;
char line[BUFFER_LEN]    

while(1){
    if(!fgets(line, BUFFER_LEN, stdin))
    {                       
        break;              
    }
    else if(line, BUFFER_LEN, SIGQUIT){
                fopen("fileOne.c","r");
            while((ch = getc(file1)) != EOF){   
                printf("%s",ch);
            } 
        } 

        if(count<20)
        {
            fputs(argv[100] ,file1);  
        }
        else{
            fclose(file1);
            file1 = fopen("fileOne.c","r"); 
            rewind(file1);        
            file2 = fopen("repicla.c","w"); 
            while((ch = getc(file1)) != EOF){              
                if((ch = getc(file1)) != "\n"){         
                    count++;            
                    if(count != 20){                
                    putc(ch, file2);            
                    }
                }   
            }   
            fclose(file1);  
            fclose(file2);  
            remove("fileOne.c");    
            rename("replica.c","fileOne.c");    
            fputs(argv[100] ,file1);   
        }
}

2 个答案:

答案 0 :(得分:1)

最重要的是,我无法编译您的代码!我很快会深入研究,但我怀疑代码中存在重大错误,您需要另外一些预订,因为你正在阅读的任何书(你 读 ,对吗?),这对你来说并不是很好。你考虑过K&amp; R2E吗?

我的编译器发出错误消息,您的编译也是如此。您可能尝试执行我们无法帮助您的陈旧二进制文件。您需要使代码可编译

假设问题已解决,您在以下代码中出现错误,您的编译器可能会警告您

while((ch = getc(file1)) != EOF){   
    printf("%s",ch);
} 

您将与int格式代表相对应的%s传递给printf。您需要传递char *。如果传递错误的类型,则会出现未定义的行为,这可能会导致崩溃。

在这种情况下,我认为您可能打算putchar(ch);printf("%c",ch);

尽管如此,当你的编译器对你大吼大叫时,不要忽视它!如果你不理解错误或警告,提出一个问题,而不是< / EM>!

答案 1 :(得分:1)

Given

int ch;

This line is undefined behavior:

printf("%s",ch);

%s is the format for a nul-terminated string. But ch is an int value, so the printf() code almost certainly treats the passed int value as an address and tries to use it as the starting address of a nul-terminated string.

That's a pretty sure-fire way to force a core dump from a SIGSEGV.