C程序在尝试写入标准输出后退出

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;

因此,我编写了一个小函数(大型程序的一部分),当我运行它并输入“GET”时,它将以1的值退出。老实说,我仍然掌握着向标准输出开放读写的概念,但不确定我在这里做错了什么

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()
一起使用,这是错误的

函数将and
int
作为第一个参数,这是一个可以通过函数创建的文件描述符,而不是返回
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()
    一起使用,这是错误的

    函数将and
    int
    作为第一个参数,这是一个可以通过函数创建的文件描述符,而不是返回
    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
    作为变量的名称,虽然这根本不会影响程序的执行或编译,但可读性很重要。