我有一个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;
}
提前谢谢!而且我真的是一个初学者 - 所以即使你提出一些超级简单的东西 - 我可能也不知道它是什么......所以请解释一下!谢谢!
答案 0 :(得分:1)
scanf("%f",&val1);
%f
需要float
变量,但给定变量为double
。将%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
次呼叫。这样,当您想要获得更多输入时,它可以轻松扩展。答案 1 :(得分:0)
尝试使用警告等进行编译。至少我使用此...
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