函数为什么不将输入映射到我的变量?

时间:2019-07-10 11:33:01

标签: c

该功能未将用户输入映射到变量

#include <stdio.h>

void input(int x);

int main (void)
{
    int h = 0;
    input(h);
    printf("%d\n", h);
}

void input(int x)
{
    printf("Enter a number: ");
    scanf("%d", &x);
}

输入5之类的内容时,我希望可以打印出5张

5 个答案:

答案 0 :(得分:3)

x按值传递,scanf更改了x的本地副本。您需要返回用户输入:

int input();

int main (void)
{
    int h;
    h = input();
    printf("%d\n", h);
}

int input()
{
    int x;
    printf("Enter a number: ");
    scanf("%d", &x);
    return x;
}

答案 1 :(得分:2)

这是因为C中的参数是通过副本传递的。因此,您修改的x只是您传递的副本,而在input的末尾,该副本将被丢弃。相反,您可以传递一个指针。由于scanf已对指针进行操作,因此修复很简单:

void input(int *x);    // parameter is now a pointer to an int

int main(void)
{
    int h = 0;
    input(&h); // pass the address instead of the value
    printf("%d\n", h);
}

void input(int *x)
{
    printf("Enter a number: ");
    scanf("%d", x); // no need to take the address again
}

答案 2 :(得分:1)

任何体面的书,教程或类都应该提到C中的参数是按值传递的。这意味着该值将被复制到局部参数变量中,并且对该局部变量的任何修改都不会反映在原始变量上。

有两种可能的解决方案:

  1. 简单的一个:从函数返回值

    int input(void)
    {
        int x;
        printf("Enter a number: ");
        scanf("%d", &x);
        return x;
    }
    
    ...
    
    int h = input();
    printf("%d\n", h);
    
  2. 复杂的解决方案:模仿通过引用传递

    void input(int *x)
    {
        printf("Enter a number: ");
        scanf("%d", x);
    }
    
    ...
    
    int h;
    input(&h);  // Pass a pointer to the variable
    printf("%d\n", h);
    

答案 3 :(得分:1)

您先致电input(h);,然后致电void input(int x) { ... }h复制x

如果您想找回更改后的值,则可以:

return来自函数input()的值:

// notice the int before function name
int input();

int main (void)
{
    int h = 0;
    // notice h = ...
    h = input(h);
    printf("%d\n", h);
}

// notice the int before function name
int input()
{
    int x;
    printf("Enter a number: ");
    scanf("%d", &x);
    // notice the return
    return x;
}

或者,将变量作为引用(指针)传递:

// notice int *
void input(int *x);

int main (void)
{
    int h = 0;
    // notice the &h this is used to pass addresses of variables
    input(&h);
    printf("%d\n", h);
}

// notice int *
void input(int *x)
{
    printf("Enter a number: ");
    // notice the & removed
    scanf("%d", x);
}

答案 4 :(得分:0)

问题是您不了解函数的基本工作流程。也许您应该再次修改您的基础知识和理论。 这是应该编写您的代码的方式(我已尽力对您的代码进行了最小的更改):

#include <stdio.h>

int input();

int main (void)
{
    int y;
    y = input();
    printf("%d\n", y);
}

int input()
{
    printf("Enter a number: ");
    scanf("%d", &x);
    return x;
}

您应该将函数input()的返回类型设置为int。然后,变量(在这种情况下为y)将获得input()返回的值,并在main()函数中使用该变量以显示用户已给出的实际输入。