C中的函数和返回值

时间:2011-04-27 08:57:38

标签: c function

我试图在本程序结束时打印出部件。我输入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;
}    

3 个答案:

答案 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;

等等。