所以我试图自己学习c(基本上没有任何编程语言的经验)现在我有一些问题,我可以在头文件中使用我的一些函数原型。
为了学习,我只使用< stdio.h> lib并且只使用printf和scanf函数,现在只打印到控制台。
我能够为我的菜单编写一个工作原型函数,它只使用printf函数,但scanf给了我更多的问题,它只是拒绝编译,我很难看到我的思维错误在哪里。
我的主要计划:
#include "menu.h"
#include "circlefunctions.h"
#include "input.h"
int main(void){
float diameter;
double straal;
double oppervlakte;
double omtrek;
while(1){
menu();
user_input();
system("cls");
switch(user_input())
{
case 1:
printf(" ----------------------------------------\n");
printf(" Typ de diameter van de cirkel: ");
scanf("%g", &diameter);
printf(" ----------------------------------------\n");
straal = diameter / 2;
oppervlakte = PI * (straal * straal);
omtrek = 2 * PI * straal;
printf(" De straal = %f \n\n", straal );
printf(" De oppervlakte = %f \n\n" , oppervlakte);
printf(" De omtrek = %f \n" , omtrek);
printf(" ----------------------------------------\n");
break;
case 2:
return(0);
case 3:
return(0);
case 9:
return(0);
case 0:
return(0);
}
}
return 0;
}
和顽固的标题:
#include <stdio.h>
void user_input();
void user_input(){
scanf("%d", &user_input);
}
尝试编译时遇到的错误在input.h中 部分; scanf(&#34;%d&#34;,&amp; user_input);
错误代码:格式&#39;%d&#39;期望参数类型为&#39; int &#39;,但参数2的类型为&#39; void()()&#39;。 并且我在主程序中的开关上也出现错误,即开关量不是整数。我怀疑这个错误是相关的,但我不确定。我仍然需要调试那部分,但如果有人愿意指出我正确的文档,我会非常感激。
我的第二个问题也与标题有关:我有&lt; stdio.h&gt;已经包含在&#34; menu.h&#34;中。我是否需要再次将其包含在&#34; input.h&#34;? (如果我正确理解预处理器是如何工作的,我不应该包含它,但遗憾的是,我无法在任何地方找到用简单术语解释的地方。)
修改
感谢大家提供有价值的信息。
@zenith谢谢你的榜样。我希望你不要在意我多问一些。
我已经在&#34; input.h&#34;中替换了我的代码。它现在将编译并运行。然而,行为已经改变。由于一些不明原因,我现在必须在程序接受我的输入之前输入两次选择。因此输入后第1个输入被忽略,它只接受第二个输入。
你能否指出我导致这个错误的方向?或者或许请指出一些解释这个问题的文档?我不想在你当中占用你宝贵的时间。
修改2
感谢您的回复和信息。我把错误拿出来了,它按预期工作(这对我来说是愚蠢的,不要看到它)。 对其他回复的人说:我会记录你的课程信息并从中学习。谢谢大家!
答案 0 :(得分:4)
user_input()
不会返回任何内容,因为它已声明void
。
但您尝试使用不存在的返回值:switch(user_input())
。
这会导致未定义的行为。
此外,这:
scanf("%d", &user_input);
尝试从int
读取stdin
并将其存储在user_input
函数的内存地址中。不是个好主意。再次,未定义的行为。
您可能希望该功能看起来像什么:
int user_input(){
int number; // store user input to this variable
scanf("%d", &number);
return number; // return the user input so that it can be used outside the function
}
答案 1 :(得分:0)
如果您在前一个头文件中声明了头文件。您不需要在随后包含的头文件中再次包含它。出于这个原因,我倾向于不在我的本地* .h文件中包含头文件。如果你尽可能地在.c文件中声明你的包含,它就避免了循环包含。
您的scanf函数的第二个参数是void(),void()类型的函数。这意味着它不需要任何参数,也不会返回任何参数或&#34; void&#34;。我想你希望你的user_input是一个类型为&#39; double&#39;的变量。这可以通过某个地方填充,也可以通过控制台的一些用户输入来调用&#39;获取&#39;来自stdin。
HTH