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

C 为什么函数没有将输入映射到我的变量?,c,parameter-passing,scanf,C,Parameter Passing,Scanf,函数未将用户输入映射到变量 #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); } #包括 无效输入(int x); 内部主(空) { int h=0; 输入

函数未将用户输入映射到变量

#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);
}
#包括
无效输入(int x);
内部主(空)
{
int h=0;
输入(h);
printf(“%d\n”,h);
}
无效输入(整数x)
{
printf(“输入一个数字:”);
scanf(“%d”和&x);
}

当输入类似于5的内容时,我希望5被打印出来

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;
}

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;
}

这是因为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
}

这是因为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
}

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

有两种可能的解决方案:

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

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


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

    有两种可能的解决方案:

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

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

  • 调用
    input(h)然后
    无效输入(intx){…}
    h
    值被复制到
    x

    如果要恢复更改后的值,可以:

    从函数
    input()
    返回一个值:

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

    调用
    input(h)然后
    无效输入(intx){…}
    h
    值被复制到
    x

    如果要恢复更改后的值,可以:

    从函数
    input()
    返回一个值:

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


    问题是您不了解功能的基本工作流程。也许你应该再次修改你的基础知识和理论。 这是您的代码应该如何编写的(我已经尽了最大努力对代码进行了最小的更改):

    #包括
    int输入();
    内部主(空)
    {
    int-y;
    y=输入();
    printf(“%d\n”,y);
    }
    int输入()
    {
    printf(“输入一个数字:”);
    scanf(“%d”和&x);
    返回x;
    }
    

    您应该将函数
    input()
    的返回类型设置为
    int
    。然后,一个变量(
    y
    在本例中)可以获取
    input()
    返回的值,并在
    main()
    函数中使用它来显示用户给出的实际输入。

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

    #包括
    int输入();
    内部主(空)
    {
    int-y;
    y=输入();
    printf(“%d\n”,y);
    }
    int输入()
    {
    printf(“输入一个数字:”);
    scanf(“%d”和&x);
    返回x;
    }
    

    您应该将函数
    input()
    的返回类型设置为
    int
    。然后,变量(
    y
    在本例中)可以获取
    input()
    返回的值,并在
    main()中使用它
    函数以显示用户提供的实际输入。

    我建议您研究通过引用传递与通过值传递之间的差异:我建议您研究通过引用传递与通过值传递之间的差异:稍微好一点,但由于您的函数现在返回值,因此不需要任何参数。是的。:)谢谢你的建议!稍微好一点,但由于您的函数现在返回一个值,因此不需要任何参数。是的。:)谢谢你的建议!
    #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;
    }