0

嗨,我编写了 ac 程序,它读取 2 个值,然后交换它们并打印新值,但第二个值一直显示 0。例如,您输入 10 表示“a”,输入 8 表示“b”,那么 a 将为 8,但b 将为 0。有人知道解决此问题的解决方案吗?这是代码:

#include <stdio.h>

int getData()
{
    int a, b;

    printf("Enter first number: ");
    scanf("%d", &a);

    printf("Enter second number: ");
    scanf("%d", &b);

    return(a, b);
}

void swapValues(int a, int b)
{

    printf("The value of a is: %d", b);
    printf("\nThe value of b is: %d", a);

    return;
}

int main()
{

    int a, b = getData();
    swapValues(a, b);

    return(0);
}
4

6 回答 6

2
return (a, b);

没有做你认为它做的事情,这是对逗号运算符的误用。

该表达式op1, op2同时计算两者op1op2但为您提供 的值op2。所以它不会传回几个值(尽管像 Python 这样的一些语言可以做这种事情)。

相似地,

int a, b = getData();

不会获取从getData(). 相反,它将设置a为一个不确定的值,并b根据函数返回的单个值进行设置。

我会看这样的东西:

#include <stdio.h>

int getData (char *which) {
    int val;

    printf ("Enter value for %s: ", which);
    scanf("%d", &val);

    return val;
}

void swapValues (int a, int b) {
    printf("The swapped value of a is: %d\n", b);
    printf("The swapped value of b is: %d\n", a);
}

int main (void) {
    int a = getData ("a");
    int b = getData ("b");
    swapValues(a, b);

    return 0;
}

您还应该记住,如果您真的想交换变量a并将b其反映回来main(而不是像它们已被交换一样打印它们),您需要将指针传递给它们并操作它们通过指针。

C 是一种按值传递的语言,这意味着对函数参数的更改通常不会反映给调用者。那会是这样的:

void swapValues (int *pa, int *pb) {
    int tmp = *pa;
    *pa = *pb;
    *pb = tmp;
}
:
swapValues (&a, &b);
// a and b are now swapped.
于 2013-04-17T06:43:08.563 回答
0

您不能从 C 函数返回多个值。我什至不确定为什么该语句会return(a, b)编译。

如果您想从函数返回多个值,则应将它们放入数组或结构中。我将使用一个结构来演示一种正确执行此操作的方法。有很多方法可以做到这一点,但这种方法对您的代码的修改最少。

struct TwoNums{
    int a;
    int b;
};

TwoNums getData()
{
    /* This creates a new struct of type struct TwoNums */
    struct TwoNums nums;

    printf("Enter first number: ");
    scanf("%d", &(nums.a));

    printf("Enter second number: ");
    scanf("%d", &(nums.b));

    return(a, b);
}

void swapValues(int a, int b)
{

    printf("The value of a is: %d", b);
    printf("\nThe value of b is: %d", a);

    return;
}

int main()
{
    /* Get the whole structure in one call */
    struct TwoNums nums = getData();

    /* Call the swap function using fields of the structure */
    swapValues(nums.a, nums.b);

    return 0;
}
于 2013-04-17T06:37:42.463 回答
0

首先,您不能在 C 中返回多个值。解决方法是返回一个结构或传递值地址。

void getData(int *a,int* b)
{
   //int a, b;

   printf("Enter first number: ");
   scanf("%d", a); // look here you passed the address of a to scanf
                    // by doing that scanf can write to a 

   printf("Enter second number: ");
   scanf("%d", b);

   //return(a, b);
  }

老主线:

  int main()
  {

    int a, b = getData(); // b gets the return value from getData()
                          // but a is still uninitialized
    //to call the new function you have to do the following
    int a,b;
    getData(&a,&b);
    swapValues(a, b);

    return(0);
    }
于 2013-04-17T06:39:30.907 回答
0

不使用临时变量。所以试试这段代码

#include <stdio.h>

int swape()
   {
  int a,b;
  printf("Enter first number: ");
  scanf("%d", &a);


printf("Enter second number: ");
scanf("%d", &b);
a=a+b;
b=a-b;
a=a-b;


printf("The value of a is: %d", a);
printf("\nThe value of b is: %d", b);

}

int main()
{

swape();

return(0);
}
于 2013-04-17T06:40:18.647 回答
0

你把整个事情不必要地复杂化了。一方面,像 return(a,b) 这样的东西在 C 中是荒谬的。此外,如果你打算交换,你为什么要传递 b 作为 printf() 的参数来打印'a'并将 a 传递给 'b' 的 printf() 吗?无论如何,这里有一个修改后的代码,可以保持简单并完成工作。

#include <stdio.h>

void swapValues()
{
    int a, b,tem;

    printf("Enter first number: ");
    scanf("%d", &a);

    printf("\nEnter second number: ");
    scanf("%d", &b);

    tem=a;
    a=b;
    b=tem;

    printf("\nThe value of a is: %d", a);
    printf("\nThe value of b is: %d", b);

        }



int main()
{

    swapValues();

    return(0);
}
于 2013-04-17T06:48:47.070 回答
0

首先:

getData()函数写错了。C 中的函数不能返回一个以上的参数。因此,您可以分开读取数据,或使用指针,如下所示:

void getData(int* a, int* b) {

    printf("Enter first number: ");
    scanf("%d", a);

    printf("Enter second number: ");
    scanf("%d", b);
}

main()

int a, b;
getData(&a, &b);

第二:

swapValues(int a, int b) 不交换数据

更正确:

void swapValues(int* a, int* b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
于 2013-04-17T06:52:11.790 回答