c程序交换值打印错误的结果

时间:2013-04-17 06:26:42

标签: c function integer parameter-passing

嗨我写了一个ac程序,读入2个值然后交换它们并打印新值,除了第二个值保持显示0.例如你输入10表示'a'和8 tor'b',然后a will是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);
}

6 个答案:

答案 0 :(得分:2)

return (a, b);

没有按照你的想法行事,这是对comma operator的误用。

表达式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;
}

您还应该记住,如果您实际想要交换变量ab,并将其反映回main(而非而不是像打印它们一样打印它们,你需要将指针传递给它们并通过指针操作它们。

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

void swapValues (int *pa, int *pb) {
    int tmp = *pa;
    *pa = *pb;
    *pb = tmp;
}
:
swapValues (&a, &b);
// a and b are now swapped.

答案 1 :(得分: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;
}

答案 2 :(得分: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);
    }

答案 3 :(得分: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);
}

答案 4 :(得分:0)

你有一点不必要地使整个事情变得复杂。对于一个,返回(a,b)之类的东西在C中是荒谬的。此外,如果你打算交换,为什么你传递b作为printf()的参数意味着打印'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);
}

答案 5 :(得分: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;
}