gpt4 book ai didi

c - 从文件读取 - 段错误(核心转储)

转载 作者:行者123 更新时间:2023-11-30 19:14:16 25 4
gpt4 key购买 nike

我对这个错误有一个大问题。我尝试了所有我知道的从文件中读取的方法(fscanf、fgets、gets、fgetln、fread、read),但我无法管理它。每次我收到段错误(核心转储)错误)。我需要做什么才能打印我的文件内容。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <signal.h>
#include <termios.h>
#include <dirent.h>
#include <err.h>
#include <errno.h>


#define MAX_COMAND_LENGTH 100
#define MAX_NUMBER_OF_PARAMS 10

int i=0;

char cmd[MAX_COMAND_LENGTH+1];
char *params[MAX_NUMBER_OF_PARAMS+1];

char cmdline[1000];
int hfd=-1,ifd=-1,ofd=-1;
int lines_in_hist = 0;
int curent_line = -1;

struct termios save_term;

char *HISTORY;

char *TEMP,*TEMP2,*ax;

void parseCmd(char *cmd, char **params)
{
for(i=0; i< MAX_NUMBER_OF_PARAMS;i++){
params[i]=strsep(&cmd," ");
if(params[i] == NULL)
break;
}
}

int main(int argc, char *argv[])
{
char *username = getenv("USER");
int status=-1;//pentru deschiderea fisierelor
int status1;
char *directory="/tmp";
char *file_name;
char buff[256];

while(1)
{
printf("%s@shell >>", username);

//citeste de pe linia de comanda
if(fgets(cmd,sizeof(cmd),stdin)==NULL)
break;

//elimina terminatorul de sir de pe o linie noua
if(cmd[strlen(cmd)-1]=='\n')
cmd[strlen(cmd)-1]='\0';

parseCmd(cmd,params);

if(!strcmp(params[0],"exit"))
exit(0);

if(!strcmp(params[0],"help"))
help();

if(!strcmp(params[0],"version"))
version();


if(!strcmp(params[0],"info"))
if(!strcmp(params[1],"tail"))
infoTail();
else if(!strcmp(params[1],"uniq"))
infoUniq();
else if(!strcmp(params[1],"cd"))
infoCd();

if(!strcmp(params[0],"uniq"))
{
if(!strcmp(params[1],"-d"))
{
printf("Enter the name of file\n");
gets(file_name);

if((status=open(file_name,O_RDONLY))==-1)
{
printf("Nu am putut deschide fisierul!");
exit(1);
}
else
{
printf("\t\t ==>%s<==\n",file_name);
sscanf(file_name,"%s",buff);
printf("Continutul fisierului:\n%s\n", buff);
}
close(status);
}
}
if(!strcmp(params[0],"cd"))
{
status1=chdir(directory);
if(status1 !=0)
perror("Eroare!");
}
}

return 0;
}

最佳答案

这些行

char *file_name;

// ...

gets(file_name);

尝试使用未初始化的指针读取数据,这可能会导致在您尝试打开文件之前按 Enter 键时将键盘读取到未定义的缓冲区中的段错误。此外,不推荐使用 gets()。奇怪的是,您确实了解 fgets() 和尾随的 newline

关于c - 从文件读取 - 段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34400241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com