我试图在本程序结束时打印出部件。我输入C17,当它应该为1时,该部分出现为0.为什么会这样?
亲切的问候
丹尼斯
# include <stdio.h>
int Part;
int getPartType(int Part);
int calcPrice(int Part);
int main(int argc, char * argv[]){
getPartType(Part);
calcPrice(Part);
return 0;
}
// Part1: Asks for input from user for part type
int getPartType(int Part) {
int nvr;
char character_one;
char character_two;
int number;
printf("Enter the part type (C17, F25, DN3, GG7 or MV4): ");
nvr = scanf("%c%c%d",&character_one,&character_two,&number);
if (number==7 && character_two=='1') {
Part=1;
}else if (number==5 && character_two=='2') {
Part=2;
}else if (number==3 && character_two=='N') {
Part=3;
}else if (number==7 && character_two=='G') {
Part=4;
}else if (number==4 && character_two=='V') {
Part=5;
}else{
printf("Wrong Part Type\n");
Part=0;
}
return Part;
}
int calcPrice(int Part) {
printf("%d\n",Part);
return 0;
}
答案 0 :(得分:5)
getPartType(Part);
返回一个int,并且不会分配给原始Part
。所以你必须改变这一行:
getPartType(Part);
到
Part = getPartType(Part);
如果要更改Part的原始值,必须使用指针。您可以在任何体面的C书中阅读更多相关信息(我推荐K&amp; R)。例如:
// takes pointer to integer and sets it to 5
void settofive(int *someInteger) {
*someInteger = 5; // dereference someInteger and set to 5
}
int main(int argc, char *argv[]) {
int test = 0;
int *ptrTotest = &test; // take address of test and store in ptrTotest
printf("%d\n", test); // prints out zero
settofive(ptrTotest);
printf("%d\n", test); // prints out five
return 0;
}
答案 1 :(得分:3)
你对函数参数传递有一点误解。
当您调用类似
的功能时getPartType(Part);
C将在堆栈上创建Part的副本,并且该函数中的所有计算都将在此副本上进行。因此,您不会更改变量Part。这称为按值调用。
要更改此问题,有两种方法。您可以使用:
Part = getPartType(Part);
这将创建Part的副本,该函数将在此副本上工作,然后返回一些东西。然后,这些东西将存储在原始部件中。在您的情况下,您实际上可以使用int getPartType(void)
作为函数声明,因为您不使用Part。
另一种方法是传递一个指针:
getPartType(&Part);
这会传递一个指向原始Part的指针,因此您可以操作原始部件(使用* -operator)。这意味着您的声明应该像void getPartType(int *)
一样。但我想说如果你只处理一个基本变量
答案 2 :(得分:0)
C是call by value。这意味着函数不能更改调用者上下文中变量的值,除非调用者传递该值的地址。
由于您的函数实际上不需要输入参数,因此应将其删除。您只需要返回值。
另外,您可以考虑使用多个return
语句,将if
- 梯子更改为:
if (number==7 && character_two=='1') {
return 1;
}else if (number==5 && character_two=='2') {
return 2;
等等。
此外,使用“神奇”数值常数通常是个坏主意。最好在main()
之前引入一个枚举,如下所示:
enum Part { PART_C17 = 1, PART_F25, PART_DN3, PART_GG7, PART_MV4 };
然后更改函数以返回此新类型的值:
enum Part getPartType(void)
{
/* ... */
}
并相应地更新if
- 阶梯中的代码:
if (number==7 && character_two=='1') {
return PART_C17;
}else if (number==5 && character_two=='2') {
return PART_F25;
等等。