C程序在尝试写入stdout后退出

时间:2015-04-08 15:12:19

标签: c unix

所以写了一个小函数(一个更大的程序的一部分),当我运行它并输入" GET"它以1的值退出。说实话,我仍然掌握了对stdout开放读写的概念,但不确定我在这里做错了什么。

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);
            }
        }    
    }
}

为了编译目的,val.def指针是一个字符串,如下所示

char defaultFile = "success.txt";

不确定我在这里缺少什么。尝试将结构指针更改为一个简单的字符串,看看它是否有任何东西,但实际上没有任何区别。我认为问题在于while循环...我不认为它应该在那里,但我还没有找到一个例子,其中一个while循环ISN&T在写入中使用stdout场景。

感谢

3 个答案:

答案 0 :(得分:3)

崩溃是因为你没有为getInput分配任何内存来指向。因此,程序在尝试跟踪指针时会崩溃,指针不会指向任何有用的东西。

使用例如malloc动态分配内存,或者用静态缓冲区替换它。

此外,您可能需要查看strcmp来比较字符串。将C中的字符串与==进行比较将不会在词法上比较字符串,而只会比较指向它们的指针。

答案 1 :(得分:2)

fscanf(stdin,"%s", getInput);

getInput永远不会被初始化或分配内存。通过分配内存来修复它

getInput = malloc(200);

答案 2 :(得分:1)

您的计划存在严重问题,最重要的一点是您使用fopen()并使用read()这是错误的。

read()函数将int作为第一个参数,这是一个可以通过open()函数创建的文件描述符,而不是fopen(),它返回一个{ {1}}对象,所以改变 [1]

FILE *

FILE *loadFile;

int loadFile;

loadFile = fopen(defaultFile, "r");

然后检查失败

loadFile = open(defaultFile, O_RDONLY);

你必须启用编译器警告以防止出现这种错误,因为程序中if (loadFile == -1) /* it failed to open check errno? perhaps... */ 的第一个参数是不兼容的类型。

fscanf()函数需要每个read()说明符的有效指针,您正在向它传递一个未指定的指针,在"%s"内取消引用它是未定义的行为。

你需要为它分配空间,这样的事情应该起作用

scanf()

请注意:

  1. 我使用char inputBuffer[100]; if (fscanf(stdin, "%99s", inputBuffer) != 1) thereWasAProblemGettingInput_DoNotUse_inputBuffer_InTheCodeThatFollows(); 作为变量的名称,虽然这根本不影响程序执行或编译,但可读性很重要。

  2. 使用inputBuffer来防止缓冲区溢出。

  3. 检查"%99s"返回的值,以确保fscanf()包含有效数据且已正确初始化。

  4. c中的字符串比较与您的代码中的许多其他语言不同

    inputBuffer

    正在比较if (getInput == "GET") 和字符串文字getInput的地址,除非您"GET"指向getInput,否则它们将不相同,因为您想比较你需要的内容

    "GET"

    相反,不要忘记包含if (strcmp(inputBuffer, "GET") == 0) 标题。


    [1] 请注意,string.h对于变量名称来说也是一个糟糕的选择,感觉就像一个函数名称,loadFile会更合适。