【问题标题】:Trouble in C program for getting output [duplicate]C程序中获取输出的问题[重复]
【发布时间】:2018-08-23 21:59:19
【问题描述】:

这是一个简单的程序

#include<stdio.h>
void get(int,int);

void main()
{
  int a,b;
  get(a,b);
  printf("In main");
  printf("%d",a);
}

void get(int m,int n)
{
  printf("enter the value");
  scanf("%d%d",&m,&n);
}

我得到的输出是

enter the value

    4
    5

主要:

0

为什么get()中的m的值没有分配给main()中的a?我的错误是什么?

【问题讨论】:

  • C 使用按值调用。 mn 是函数get()输入,但如果get 修改它们(就像这里所做的那样),修改后的值不会他们回到main()。本质上,您正在尝试定义一个返回两个值的get 函数。有很多方法可以做到这一点,但它们更先进。建议暂时不要担心这个。
  • 您可能需要一个指向该值的指针,以便您可以更改它,并且该值也将在get() 函数的范围之外更改。否则你会想要返回一些东西,因为这些值在你的函数结束时被丢弃。
  • 正确缩进您的代码。机器(编译器)可以读取和编译任何东西,但是对于人类来说,它需要在将文本块读取为 code 时做出一点sense。提问时,文本区域右侧有一个橙色的大如何格式化框。还有一个完整的格式化辅助工具栏。还有一个 [?] 按钮提供格式化帮助。还有一个预览区域,显示您的帖子发布后的样子。使您的帖子清晰,并证明您花时间这样做,可以提高您获得好答案的机会。
  • @RohanKumar 如果您能够更彻底地编辑散文以提高可读性,您的编辑可能会更早被接受......
  • 另外,与您的问题无关,但您应该知道:main() 应该是 int,而不是 void。最好在你还在学习的时候把它做好。

标签: c


【解决方案1】:

您正在通过值传递主要变量。阅读有关如何通过引用传递的信息,herescanf 需要变量的地址才能修改它们;所以你需要像这样传递他们的地址:

get(&a, &b);

您可以像这样修改您的get() 方法:

void get(int* pM,int* pN) {
  printf("enter the value");
  scanf("%d%d, pM, pN);
}

【讨论】:

    【解决方案2】:

    您的 scanf 读入函数局部变量,这些变量存储您作为参数提供给函数的值。
    它们的值在作为函数参数提供的变量中不可见。
    您可能希望使用指向变量的指针作为参数,然后读取的值最终会出现在这些指针参数指向的变量中。

    【讨论】:

      【解决方案3】:

      这基本上是由于变量的作用域而发生的,因为整数是按值而不是按引用传递的。

      您需要返回 ab 的值,以便它们出现在 main() 中。

      在这里查看更多 https://www.tutorialspoint.com/cprogramming/c_function_call_by_value.htm

      #inlcude<stdio.h>
      int get(int,int);
      void main() {
          int a,b;
          a = get(a,b);
          printf("In main");
          printf("%d",a);
      }
      int get(int m,int n){
          printf("enter the value");
          scanf("%d%d,&m,&n);
          return m;
      }
      

      输入值

      10 20

      主要

      10

      此外,请阅读有关缩进代码的信息,以使其更具可读性。

      【讨论】:

        【解决方案4】:

        为什么get()中m的值没有赋值给main()中的a?我的错误是什么?

        首先,你需要了解C中参数传递的概念。
        [如果你不了解形参和实参,请查看this]

        从技术上讲,C 中的所有内容都是按值传递的。这里,

        get(a,b);
        

        您将ab 变量的值传递给函数get()实际参数ab的值将被复制到形式参数mn[在这种情况下, ab 变量是垃圾,因为您还没有初始化它们]。调用函数中对形参(mn)值的任何修改都不会反映在实际参数(ab)中,因为形参存储是分开的。因此,get() 中的m 的值不会分配给main() 中的a

        以下部分答案基于您了解 C 语言中指针概念的假设。如果没有,我建议选择一本好的 C 语言书籍/教程,并通过指针的概念。

        C 语言提供了一种将指针传递给函数的工具,该函数也是仅按值传递的。它将指针的值(即地址)复制到函数形式参数,您可以通过取消引用指针来访问存储在该地址的值。因此,对传递地址的值所做的任何更改都会反映在调用函数的实际参数中。

        所以,你可以这样做:

        #include<stdio.h>
        
        void get(int *, int *);
        
        int main()
        {
            int a, b;
            get(&a, &b);
            printf("In main\n");
            printf("a : %d, b = %d\n", a, b);
        }
        
        void get(int *m,int *n)
        {
            printf("Enter the value:\n");
            scanf("%d%d", m, n); // m holds the address of a and n holds the address of b variable. 
        
            printf("Value entered:\n");
            printf("%d %d\n", *m, *n); //dereferencing the pointer m and n
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多