Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
2年前关闭。
有代码。
错误:
我究竟做错了什么?
应始终使用
这三行代码都是Windows特有的,在这样的程序中应该完全没有必要。删除它们。
这个结构定义没有错。
由于历史原因,您需要编写
这是您最重要的错误:您已经声明了一个指向
指针是语言最困难的方面之一,特别是对于刚接触编程的人。如果您的书没有至少花整整一章专门介绍指针,而没有其他内容,那是一本糟糕的教科书,您需要获得更好的教科书。
与上述更改一致,因为不再有指针,所以请写
不要使用非标准函数
这是您必须处理指针的地方。在格式字符串之后,
据说
与我上面对
当您获得更多经验时,您会发现
与
在要打印的文本中,请勿在
即使在今天,代码的宽度也不应超过80列,因为那样一来,您可以立即在屏幕上并排获得两个代码文件,并且仍使用合理的字体大小。当您使用复杂程序时,这是绝对至关重要的事情。 (此外,通常很难阅读真正宽的文本。)
在程序结束前立即调用
程序未失败,因此应返回0,而不是1。
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
2年前关闭。
#include "stdio.h"
#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#define getch() _getch()
struct Clicker {
int toggle;
int average;
};
int main()
{
struct Clicker *clicker;
printf("Enter your toggle key: ");
(*clicker).toggle = _getch();
printf("Enter your average cps: ");
scanf_s("%d", (*clicker).average);
printf("\nCurrent settings: \nToggle: %i \nAverage:%i\n", clicker->toggle, clicker->average);
getchar();
return 1;
}
有代码。
错误:
'_getch' undefined, assuming extern returning int
'scanf_s' format string '%d' requires an argument of type 'int *' but variadic arguemnt 1 has type int.
uninitialized local variable 'clicker' used.
我究竟做错了什么?
最佳答案
您说您正在尝试自己学习C,因此我将实际解释该程序中的所有错误。
#include "stdio.h"
应始终使用
stdio.h
的<>
形式包含#include
。 (""
形式用于程序的头文件,而<>
形式用于系统提供的库的头文件。在复杂的程序中,区别可能会变得模糊,但不必为此担心。现在。)#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#define getch() _getch()
这三行代码都是Windows特有的,在这样的程序中应该完全没有必要。删除它们。
struct Clicker {
int toggle;
int average;
};
这个结构定义没有错。
int main()
由于历史原因,您需要编写
int main(void)
。这通常是无害的,但是用C编写空函数参数列表是一种不好的习惯。{
struct Clicker *clicker;
这是您最重要的错误:您已经声明了一个指向
struct Clicker
的指针,当您想要的是使用该结构声明局部变量时。改写struct Clicker clicker
。指针是语言最困难的方面之一,特别是对于刚接触编程的人。如果您的书没有至少花整整一章专门介绍指针,而没有其他内容,那是一本糟糕的教科书,您需要获得更好的教科书。
printf("Enter your toggle key: ");
(*clicker).toggle = _getch();
与上述更改一致,因为不再有指针,所以请写
clicker.toggle = ...
而不是(*clicker).toggle =
。不要使用非标准函数
_getch()
,而应使用getchar()
。 (有些程序实际上需要使用_getch
,但这不是其中之一。) printf("Enter your average cps: ");
scanf_s("%d", (*clicker).average);
这是您必须处理指针的地方。在格式字符串之后,
scanf
的所有参数都必须是指向变量的指针,因为这使scanf
可以写入变量。 clicker
不再是指针,但是即使我们没有进行更改,您编写的内容也会出错,因为即使(*clicker).average
是,clicker
也不是指针。你需要写的是 scanf("%d", &clicker.average);
据说
&
运算符采用变量clicker.average
的地址,产生scanf
所需的指针。与我上面对
_getch
所说的类似,永远不要使用非标准函数scanf_s
。 (所有名称均以_s
结尾的功能均来自Microsoft出于良好意图,但灾难性的无效尝试,以弥补标准C库中的一堆设计错误。它们在大多数操作系统中均不存在,并且它们不要解决他们打算解决的问题。请勿使用其中任何一个。)当您获得更多经验时,您会发现
scanf
麻烦多于其应有的价值,但是对于像这样的琐碎程序,就可以了。 printf("\nCurrent settings: \nToggle: %i \nAverage:%i\n",
clicker->toggle, clicker->average);
与
scanf
不同,printf
接受值,而不是指向变量的指针,因此这是正确的,只是我们必须将clicker->toggle
更改为clicker.toggle
,将clicker->average
更改为clicker.average
,因为clicker
不再是指针。在要打印的文本中,请勿在
\n
之前紧跟空格。即使在今天,代码的宽度也不应超过80列,因为那样一来,您可以立即在屏幕上并排获得两个代码文件,并且仍使用合理的字体大小。当您使用复杂程序时,这是绝对至关重要的事情。 (此外,通常很难阅读真正宽的文本。)
getchar();
在程序结束前立即调用
getchar
是不好的风格。程序运行完成后,应退出。如果您的IDE在程序退出后拒绝保留“控制台”窗口,请使用更好的IDE。 return 1;
程序未失败,因此应返回0,而不是1。
关于c - 在C中创建一个小结构-出现一些错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43168596/
10-12 16:15