Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过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