Beginner in C: 无法正确 printf 双精度数组的第一个和最后一个元素?

huangapple go评论65阅读模式
英文:

Beginner in C: Can't properly printf first and last element in double array?

问题

我正在尝试在命令行上显示一个愿望清单。用户输入项目的成本、优先级(1-3级)以及是否有融资选项(y/n)。输入的值被放入多个数组中。用户输入所有值后,它们将在表格中显示。

我的代码中的一切都运行正常,除了当我尝试在表格中使用printf打印用户输入的成本值double itemCosts[numOfItems];)时出现问题。**第一个和最后一个元素打印不正确**,即使我为它们都输入相同的价格(6225.88)。最后一个元素只是0.000000。请参见表格输出的图片。

我尝试通过将与成本相关的循环分开进行调试,并将它们编译/运行为另一个文件,成本显示正确...所以我认为错误可能在其他地方,但我找不到它。

[![enter image description here][1]][1]

    #define MAX_ITEMS 10
    
    #include <stdio.h>
    
    int main()
    
    {
    	const double MIN_INCOME = 500, MAX_INCOME = 400000;
    	int numOfItems;
    	double netIncome, itemTotal;
    	double itemCosts[MAX_ITEMS];
    	int itemPriors[MAX_ITEMS];
    	char itemFinOps[MAX_ITEMS];
    
    	printf("+--------------------------+\n");
    	printf("+   Wish List Forecaster   |\n");
    	printf("+--------------------------+\n\n");
    
    	// Prompt for net monthly income
    	do
    	{
    		printf("Enter your monthly NET income: $");
    		scanf("%lf", &netIncome);
    		if (netIncome < MIN_INCOME)
    		{
    			printf("ERROR: You must have a consistent monthly income of at least $500.00\n\n");
    		}
    		else if (netIncome > MAX_INCOME)
    		{
    			printf("ERROR: Liar! I'll believe you if you enter a value no more than $400000.00\n\n");
    		}
    	} while (!(netIncome >= MIN_INCOME && netIncome <= MAX_INCOME));
    
    	printf("\n");
    
    	// Prompt for # of wish list items
    	do
    	{
    		printf("How many wish list items do you want to forecast?: ");
    		scanf("%d", &numOfItems);
    
    		if (!(numOfItems > 0 && numOfItems <= MAX_ITEMS))
    		{
    			printf("ERROR: List is restricted to between 1 and 10 items.\n\n");
    		}
    
    		printf("\n");
    	} while (!(numOfItems > 0 && numOfItems <= MAX_ITEMS));
    
    	// Store wish list item details
    	for (int i = 0; i < numOfItems; i++)
    	{
    		printf("Item-%d Details:\n", i + 1);
    
    		do //////////////// ******** PROMPT COST ********** //////////
    		{
    			printf("Item cost: $");
    			scanf("%lf", &itemCosts[i]);
    			if (!(itemCosts[i] >= (double)100))
    			{
    				printf("   ERROR: Cost must be at least $100.00\n");
    			}
    		} while (!(itemCosts[i] >= (double)100));
    
    		do // prompt priority
    		{
    			printf("How important is it to you? [1=must have, 2=important, 3=want]: ");
    			scanf("%d", &itemPriors[i]);
    			if (!(itemPriors[i] >= 1 && itemPriors[i] <= 3))
    			{
    				printf("   ERROR: Value must be between 1 and 3\n");
    			}
    		} while (!(itemPriors[i] >= 1 && itemPriors[i] <= 3));
    
    		do // prompt finance options
    		{
    			printf("Does this item have financing options? [y/n]: ");
    			scanf(" %c", &itemFinOps[i]);
    			if (!(itemFinOps[i] == 'y' || itemFinOps[i] == 'n'))
    			{
    				printf("   ERROR: Must be a lowercase 'y' or 'n'\n");
    			}
    		} while (!(itemFinOps[i] == 'y' || itemFinOps[i] == 'n'));
    
    		printf("\n");
    	}
    
    	///////// display summary of item details in TABLE //////////
    	printf("Item Priority Financed        Cost\n");
    	printf("---- -------- -------- -----------\n");
    
    	for (int j = 0; j < numOfItems; j++)
    	{
    		printf("  %d      %d        %c    %lf\n", j + 1, itemPriors[j], itemFinOps[j], itemCosts[j]);
    		itemTotal += itemCosts[j];
    	}

	return 0;
}
  [1]: https://i.stack.imgur.com/WeXF4.png
英文:

I'm trying to display a Wish List on the command line. The user enters the cost of the item, the level of priority (1-3), and whether or not it has financing options (y/n). The inputted values are put in multiple arrays. After the user enters all their values, they're displayed in a table at the end.

Everything in my code works fine except when I try to printf the user inputed cost values (double itemCosts[numOfItems];) in the table. The first and last element don't print properly, even when I input the same price (6225.88) for all of them. The last element is just 0.000000. See included pic of table output.

I tried debugging the issue by separating the cost-related loops and compiling/running them as another file and the costs display correctly...so I'm thinking the bug is somewhere else, but I can't find it.

Beginner in C: 无法正确 printf 双精度数组的第一个和最后一个元素?

#define MAX_ITEMS 10
#include &lt;stdio.h&gt;
int main()
{
const double MIN_INCOME = 500, MAX_INCOME = 400000;
int numOfItems;
double netIncome, itemTotal;
double itemCosts[numOfItems];
int itemPriors[numOfItems];
char itemFinOps[numOfItems];
printf(&quot;+--------------------------+\n&quot;);
printf(&quot;+   Wish List Forecaster   |\n&quot;);
printf(&quot;+--------------------------+\n\n&quot;);
// Prompt for net monthly income
do
{
printf(&quot;Enter your monthly NET income: $&quot;);
scanf(&quot;%lf&quot;, &amp;netIncome);
if (netIncome &lt; MIN_INCOME)
{
printf(&quot;ERROR: You must have a consistent monthly income of at least $500.00\n\n&quot;);
}
else if (netIncome &gt; MAX_INCOME)
{
printf(&quot;ERROR: Liar! I&#39;ll believe you if you enter a value no more than $400000.00\n\n&quot;);
}
} while (!(netIncome &gt;= MIN_INCOME &amp;&amp; netIncome &lt;= MAX_INCOME));
printf(&quot;\n&quot;);
// Prompt for # of wish list items
do
{
printf(&quot;How many wish list items do you want to forecast?: &quot;);
scanf(&quot;%d&quot;, &amp;numOfItems);
if (!(numOfItems &gt; 0 &amp;&amp; numOfItems &lt;= MAX_ITEMS))
{
printf(&quot;ERROR: List is restricted to between 1 and 10 items.\n\n&quot;);
}
printf(&quot;\n&quot;);
} while (!(numOfItems &gt; 0 &amp;&amp; numOfItems &lt;= MAX_ITEMS));
// Store wish list item details
for (int i = 0; i &lt; numOfItems; i++)
{
printf(&quot;Item-%d Details:\n&quot;, i + 1);
do //////////////// ******** PROMPT COST ********** //////////
{
printf(&quot;Item cost: $&quot;);
scanf(&quot;%lf&quot;, &amp;itemCosts[i]);
if (!(itemCosts[i] &gt;= (double)100))
{
printf(&quot;   ERROR: Cost must be at least $100.00\n&quot;);
}
} while (!(itemCosts[i] &gt;= (double)100));
do // prompt priority
{
printf(&quot;How important is it to you? [1=must have, 2=important, 3=want]: &quot;);
scanf(&quot;%d&quot;, &amp;itemPriors[i]);
if (!(itemPriors[i] &gt;= 1 &amp;&amp; itemPriors[i] &lt;= 3))
{
printf(&quot;   ERROR: Value must be between 1 and 3\n&quot;);
}
} while (!(itemPriors[i] &gt;= 1 &amp;&amp; itemPriors[i] &lt;= 3));
do // prompt finance options
{
printf(&quot;Does this item have financing options? [y/n]: &quot;);
scanf(&quot; %c&quot;, &amp;itemFinOps[i]);
if (!(itemFinOps[i] == &#39;y&#39; || itemFinOps[i] == &#39;n&#39;))
{
printf(&quot;   ERROR: Must be a lowercase &#39;y&#39; or &#39;n&#39;\n&quot;);
}
} while (!(itemFinOps[i] == &#39;y&#39; || itemFinOps[i] == &#39;n&#39;));
printf(&quot;\n&quot;);
}
///////// display summary of item details in TABLE //////////
printf(&quot;Item Priority Financed        Cost\n&quot;);
printf(&quot;---- -------- -------- -----------\n&quot;);
for (int j = 0; j &lt; numOfItems; j++)
{
printf(&quot;  %d      %d        %c    %lf\n&quot;, j + 1, itemPriors[j], itemFinOps[j], itemCosts[j]);
itemTotal += itemCosts[j];
}
return 0;

}

答案1

得分: 3

    int numOfItems; // 未初始化的`numOfItems`变量,这是未定义行为。在C中,表格不会在更改此变量时增长或缩小大小。
double netIncome, itemTotal;
double itemCosts[numOfItems];
int itemPriors[numOfItems];
char itemFinOps[numOfItems];

更改为:

double itemCosts[MAX_ITEMS]; // 请确保`MAX_ITEMS`已经定义
int itemPriors[MAX_ITEM]; // 请确保`MAX_ITEM`已经定义
char itemFinOps[MAX_ITEM]; // 请确保`MAX_ITEM`已经定义

始终检查scanf的结果。示例:

if (scanf("%lf", &netIncome) != 1){ /* 处理错误 */ }
英文:
    int numOfItems;
double netIncome, itemTotal;
double itemCosts[numOfItems];
int itemPriors[numOfItems];
char itemFinOps[numOfItems];

It is undefined behaviour as your numOfItems is not inilized. In C table will not grow or shrink to the size when you change this variable

Change to:

double itemCosts[MAX_ITEMS];
int itemPriors[MAX_ITEM];
char itemFinOps[MAX_ITEM];

Always check the result of scanf. Exmaple:

if(scanf(&quot;%lf&quot;, &amp;netIncome) != 1){ /* handle error*/}

答案2

得分: 0

正如来自莫斯科的弗拉德和0___________所说,您不能使用未初始化的变量来定义数组的元素数量。您可以定义变量如下:

double *itemCosts;
int *itemPriors;
char *itemFinOps;

在变量numOfItems获得一个值后,您可以动态分配内存,如下所示:

itemCosts = (double*) malloc(numOfItems * sizeof(double));
itemPriors = (int*) malloc(numOfItems * sizeof(int));
itemFinOps = (char*) malloc(numOfItems * sizeof(char));

或者

itemCosts = (double*) calloc(numOfItems, sizeof(double));
itemPriors = (int*) calloc(numOfItems, sizeof(int));
itemFinOps = (char*) calloc(numOfItems, sizeof(char));

calloc会将数组的所有元素初始化为0。

最后,您必须释放分配的内存:

free(itemCosts);
free(itemPriors);
free(itemFinOps);
英文:

As Vlad from Moscow and 0___________ said, you cannot define an array using a not initialised variable for the number of its elements. You can define the variables as

double *itemCosts;
int *itemPriors;
char *itemFinOps;

and after the variable numOfItems is given a value, you dynamically allocate memory as follows:

itemCosts = (double*) malloc(numOfItems * sizeof(double));
itemPriors = (int*) malloc(numOfItems * sizeof(int));
itemFinOps = (char*) malloc(numOfItems * sizeof(char));

or

itemCosts = (double*) calloc(numOfItems, sizeof(double));
itemPriors = (int*) calloc(numOfItems, sizeof(int));
itemFinOps = (char*) calloc(numOfItems, sizeof(char));

calloc initialises all elements of array to 0

At the end you must free the allocated memory:

free(itemCosts);
free(itemPriors);
free(itemFinOps);

huangapple
  • 本文由 发表于 2023年2月16日 03:46:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/75464775.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定