我有一个C初学者类的任务:我应该创建一个有一个变量(命名值)和一个指向列表的指针的结构。我应该提示用户输入5个值,并将它们存储在链接列表中。然后打印出列表。我不知道如何将输入存储到列表中。我确实写了一个程序,初始化了5个值。但我不知道如何接受输入并将其存储到列表中。
这是我初始化值的工作程序:
#include <stdio.h>
struct list
{
double value;
struct list *nextVal;
};
int main()
{
struct list v1 = {10};
struct list v2 = {17.97};
struct list v3 = {166};
struct list v4 = {2};
struct list v5 = {387.55};
struct list *first;
first = &v1;
v1.nextVal = &v2;
v2.nextVal = &v3;
v3.nextVal = &v4;
v4.nextVal = &v5;
v5.nextVal = NULL;
printf("All the values are: %.2f, %.2f, %.2f, %.2f, %.2f.",
first->value,v1.nextVal->value,v2.nextVal->value,
v3.nextVal->value,v4.nextVal->value);
return 0;
}
这里有一个程序,我尝试获取用户输入并将其存储到列表中。(我只有2个值,而不是5,因为当我试图使它工作时,使用它更容易。)当我编译这个程序时,我没有错误。当我运行它时,会正确地提示我输入两个输入值;但是,当程序打印的输出只为两个值写入0时。我的假设是,我把值存储在列表中是错误的——因为我不知道它实际上是如何做到的。(在我的课本或网上找不到任何信息。)昨晚有人评论了另一个问题,我不得不尝试使用断点来找出问题的确切位置——从那以后我一直在努力找出它,但还不知道如何做到这一点。(我认为这是一件非常简单的事情,但无论我在网上看到哪里,人们都会以一种似乎我应该知道他们在说什么的方式来解释它,但我没有。老实说,即使我能弄清楚,我仍然不知道该如何处理这些信息,因为我找不到任何关于如何将用户输入存储到链接列表中的信息。)无论如何,所以这是我的试用程序,它符合并运行,但两个最终值都为0:
#include <stdio.h>
struct list
{
double value;
struct list *nextVal;
};
int main()
{
double val1,val2;
printf("Please enter a number: ");
scanf("%f",&val1);
printf("Please enter a number: ");
scanf("%f",&val2);
struct list v1 = {val1};
struct list v2 = {val2};
struct list *first;
first = &v1;
v1.nextVal = &v2;
v2.nextVal = NULL;
printf("The two values entered are %.2f and %.2f.",
first->value,v1.nextVal->value);
return 0;
}
提前谢谢!我真的是一个初学者,所以即使你建议一些超级简单的东西,我也可能不知道它是什么…所以请解释一下!非常感谢。
scanf("%f",&val1);
CCD_ 1需要CCD_ 2变量,但给定的变量是CCD_。将%lf
用于double
。
scanf("%lf",&val1);
你的编译器应该给你一个警告,你应该时刻注意并解决它们:
warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double *’ [-Wformat=]
scanf("%f",&val1);
一些额外的建议,尽管它们并没有直接解决你的问题:
- 始终检查函数返回值。具体来说,检查
scanf
以确保已解析预期的输入。如果用户输入了意外的内容,则代码将失败 - 将代码分解为函数。具体来说,制作一个单独的
insert
函数,将项目添加到链表中 - 在需要重复代码的地方使用循环。例如用于
scanf
呼叫。这样,当你想接受更多的输入时,它可以很容易地扩展
尝试在等上使用警告进行编译。至少我使用这个。。。
gcc -Wall -pedantic -std=c11
工作版本
include <stdio.h>
struct list
{
double value;
struct list *nextVal;
};
int main()
{
double val1,val2;
printf("Please enter a number: ");
scanf("%lf",&val1);
printf("Please enter a number: ");
scanf("%lf",&val2);
struct list v1 = {val1};
struct list v2 = {val2};
struct list *first;
first = &v1;
v1.nextVal = &v2;
v2.nextVal = NULL;
printf("The two values entered are %.2f and %.2f.",
first->value,v1.nextVal->value);
return 0;
}
您正在扫描引号,并试图将其分配给一个双引号。一个好的编译器会给你一个警告。。
scanf.c:14:14: warning: format specifies type 'float *' but the argument has type 'double *' [-Wformat]
scanf("%f",&val1);
~~ ^~~~~
%lf
scanf.c:16:14: warning: format specifies type 'float *' but the argument has type 'double *' [-Wformat]
scanf("%f",&val2);
~~ ^~~~~
%lf