所以写了一个小函数(一个更大的程序的一部分),当我运行它并输入" 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
场景。
感谢
答案 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()
请注意:
我使用char inputBuffer[100];
if (fscanf(stdin, "%99s", inputBuffer) != 1)
thereWasAProblemGettingInput_DoNotUse_inputBuffer_InTheCodeThatFollows();
作为变量的名称,虽然这根本不影响程序执行或编译,但可读性很重要。
使用inputBuffer
来防止缓冲区溢出。
检查"%99s"
返回的值,以确保fscanf()
包含有效数据且已正确初始化。
c中的字符串比较与您的代码中的许多其他语言不同
inputBuffer
正在比较if (getInput == "GET")
和字符串文字getInput
的地址,除非您"GET"
指向getInput
,否则它们将不相同,因为您想比较你需要的内容
"GET"
相反,不要忘记包含if (strcmp(inputBuffer, "GET") == 0)
标题。
[1] 请注意,string.h
对于变量名称来说也是一个糟糕的选择,感觉就像一个函数名称,loadFile
会更合适。 子>