C程序在尝试写入标准输出后退出
因此,我编写了一个小函数(大型程序的一部分),当我运行它并输入“GET”时,它将以1的值退出。老实说,我仍然掌握着向标准输出开放读写的概念,但不确定我在这里做错了什么C程序在尝试写入标准输出后退出,c,unix,C,Unix,因此,我编写了一个小函数(大型程序的一部分),当我运行它并输入“GET”时,它将以1的值退出。老实说,我仍然掌握着向标准输出开放读写的概念,但不确定我在这里做错了什么 int input_arg() { MainStruct val; //variables are loaded from a config file to this structure char *getInput; char *fileInput; FILE *loadfile;
int input_arg()
{
MainStruct val; //variables are loaded from a config file to this structure
char *getInput;
char *fileInput;
FILE *loadfile;
char buffer[1024];
int n;
int defaultFile = val.def; //success.txt value read when fileparser.c is run
printf("http >> :");
fflush(NULL);
fscanf(stdin,"%s", getInput);
if (getInput == "GET")
{
loadfile = fopen(defaultFile, "r");
if (loadfile == NULL)
{
fprintf(stderr, "error loading default resource: PROGRAM WILL EXIT");
exit(0);
}
while ((n = read(loadfile, buffer, sizeof(buffer))) > 0) //reads file (not sure this should be a while loop)
{
if((write(STDOUT_FILENO, buffer, n)) < 0) //writes to stdout
{
perror("failed to display file to output");
close(loadfile);
exit(1);
}
}
}
}
int-input_-arg()
{
MainStruct val;//变量从配置文件加载到此结构
char*getInput;
字符*文件输入;
文件*加载文件;
字符缓冲区[1024];
int n;
int defaultFile=val.def;//运行fileparser.c时读取success.txt值
printf(“http>>:”);
fflush(空);
fscanf(标准输入,“%s”,获取输入);
如果(getInput==“GET”)
{
loadfile=fopen(默认文件,“r”);
if(loadfile==NULL)
{
fprintf(stderr,“加载默认资源时出错:程序将退出”);
出口(0);
}
while((n=read(loadfile,buffer,sizeof(buffer)))>0)//读取文件(不确定这应该是while循环)
{
if((write(STDOUT\u FILENO,buffer,n))<0)//写入STDOUT
{
perror(“未能显示要输出的文件”);
关闭(加载文件);
出口(1);
}
}
}
}
出于编译目的,val.def指针是一个字符串,如下所示
char defaultFile=“success.txt”代码>
不确定我在这里遗漏了什么。尝试将结构指针更改为一个简单的字符字符串,以查看它是否存在,但实际上没有任何区别。我认为问题在于while
循环……我认为它不应该存在,但我还没有找到一个在写入stdout
场景中不使用while循环的示例
谢谢它崩溃了,因为您没有为getInput
分配任何内存来指向它。因此,当程序试图跟随指针时会崩溃,指针不会指向任何有用的东西
可以使用例如malloc
动态分配内存,也可以使用静态缓冲区替换内存
此外,您可能需要查看strcmp以比较字符串。将C中的字符串与==
进行比较不会在词汇上比较字符串,相反,它只会比较指向它们的指针。它会崩溃,因为您没有为getInput
分配指向它们的内存。因此,当程序试图跟随指针时会崩溃,指针不会指向任何有用的东西
fscanf(stdin,"%s", getInput);
可以使用例如malloc
动态分配内存,也可以使用静态缓冲区替换内存
此外,您可能需要查看strcmp以比较字符串。将C中的字符串与==
进行比较不会在词汇上比较字符串,而只会比较指向它们的指针
fscanf(stdin,"%s", getInput);
getInput
从未初始化或分配内存。请通过分配内存来修复它
getInput = malloc(200);
getInput
从未初始化或分配内存。请通过分配内存来修复它
getInput = malloc(200);
您的程序存在严重问题,最重要的问题是您正在将fopen()
与read()
一起使用,这是错误的
函数将andint
作为第一个参数,这是一个可以通过函数创建的文件描述符,而不是返回file*
对象的fopen()
到
及
到
然后检查故障
if (loadFile == -1) /* it failed to open check errno? perhaps... */
必须启用编译器警告以防止此类错误,因为程序中read()
的第一个参数的类型不兼容
函数要求每个“%s”
说明符都有一个有效指针,如果您将未初始化的指针传递给该说明符,则在scanf()中取消引用它。
是未定义的行为
你需要为它分配空间,像这样的东西应该会起作用
char inputBuffer[100];
if (fscanf(stdin, "%99s", inputBuffer) != 1)
thereWasAProblemGettingInput_DoNotUse_inputBuffer_InTheCodeThatFollows();
请注意:
我使用了inputBuffer
作为变量的名称,虽然这根本不会影响程序的执行或编译,但可读性很重要
用于防止缓冲区溢出的“%99s”
检查由fscanf()
返回的值,以确保inputBuffer
具有有效数据并且已正确初始化
在代码中,c语言中的字符串比较与许多其他语言不同
if (getInput == "GET")
正在比较getInput
的地址和字符串literal“GET”
,除非将getInput
指向“GET”
,否则它们将不相同,因为您要比较所需的内容
if (strcmp(inputBuffer, "GET") == 0)
相反,不要忘记包含string.h
标题
[1] 请注意,loadFile
对于变量名也是一个不好的选择,它感觉像是一个函数名,inputFile
更合适。您的程序有严重的问题,最重要的问题是您正在使用fopen()
和read()
一起使用,这是错误的
函数将andint
作为第一个参数,这是一个可以通过函数创建的文件描述符,而不是返回file*
对象的fopen()
到
及
到
然后检查故障
if (loadFile == -1) /* it failed to open check errno? perhaps... */
必须启用编译器警告以防止此类错误,因为程序中read()
的第一个参数的类型不兼容
函数要求每个“%s”
说明符都有一个有效指针,如果您将未初始化的指针传递给该说明符,则在scanf()中取消引用它。
是未定义的行为
你需要为它分配空间,像这样的东西应该会起作用
char inputBuffer[100];
if (fscanf(stdin, "%99s", inputBuffer) != 1)
thereWasAProblemGettingInput_DoNotUse_inputBuffer_InTheCodeThatFollows();
请注意:
我使用了inputBuffer
作为变量的名称,虽然这根本不会影响程序的执行或编译,但可读性很重要。