C编程...为什么“ return”语句在此代码中仅给出一个值?

时间:2018-10-30 19:00:31

标签: c return

我是C语言的新手。我正在尝试编写一个在数组的第一个位置添加值的程序。如下所示,append函数必须返回多个值。

当我在此函数中使用printf("%d ", array[c])语句时,没有问题,我得到了想要的值。

但是,当我在此函数中使用return s;语句时,尽管它必须与printf("%d ", array[c])语句给出相同的值,但它仅给出一个值。

当我使用printf("%d ", array[c])运行此代码时,输​​出为:

  

25、5、8、555、99

当我使用return s运行此代码时,输​​出为;

  

25

为什么两个语句之间有区别?我不需要在屏幕上打印这些值。我需要使用return语句。为此请帮我...

#include <stdio.h>

int append(int array[]){

          int  position, c, s, len=4, value=25; 

          position=1;

          for (c = len - 1; c >= position-1; c--){
              array[c+1] = array[c];
              }
          array[position-1] = value;
          for (c = 0; c <= len; c++){

                //return array[c]; // <-- why this give only one value???   
                printf("%d ", array[c]);    //<--  this print the all value !!! 
              }          
}

int main(){

    int kar[]= {5, 8, 555, 99};

    printf("%d", append(kar));

    return 0;
}

3 个答案:

答案 0 :(得分:0)

在C中,每个函数必须恰好返回一个值。 (如果不需要返回任何内容,可以为void。)

如果要从一个函数获得多个结果,可以通过两种方法实现。

选项一:,在函数中,分配某种结构以容纳多个值(通常但不一定是数组),并使 one 返回值您的函数就是该结构的指针。函数的调用者通常会在完成该结构后负责清理该结构,例如使用free

选项二::让您的函数使用某种指向多个值(通常但不一定是数组)的容器的指针,然后通过将它们添加到容器中来“返回”结果

在任何一种情况下,调用者(在这种情况下为main)都有责任对每个值进行有意义的操作,例如,使用for循环来打印所有值

答案 1 :(得分:0)

您正在将array传递给函数,该函数实际上是将指针传递给数组的第一个元素。这意味着对函数数组的更改也将出现在调用函数中,因为它是同一数组。

您不需要返回任何东西。只需在main中打印数组的内容。

此外,大小为4的数组的索引从0到3。现在,您正在写超出数组末尾的内容。您需要更改功能以防止这种情况。您不能只写完数组的末尾以使其更大。大小是固定的。

void append(int array[]){
      int  position, c, s, len=4, value=25; 
      position=1;

      for (c = len - 2; c >= position-1; c--){
          array[c+1] = array[c];
      }
      array[position-1] = value;
}

int main() {
    int kar[]= {5, 8, 555, 99};

    append(kar);

    int c;
    for (c = 0; c < 4; c++){
        printf("%d ", kar[c]);
    }       
    return 0;
}

答案 2 :(得分:0)

  

当我使用“ printf(“%d”,array [c])“运行此代码时,输​​出为;

     

25、5、8、555、99

那是因为您正在将printf语句作为循环的一部分进行调用:

for (c = 0; c <= len; c++){
  printf("%d ", array[c]);    
}       

爱荷华州,您正在打电话

printf("%d ", array[0]); // prints 25
printf("%d ", array[1]); // prints 5
printf("%d ", array[2]); // prints 555
printf("%d ", array[3]); // prints 99
带有printf修饰符的

%d 不能打印整个int数组-一次只能打印单个int值。

请注意,您的return语句

return array[c];

仅返回数组的单个元素(在循环内,将是元素0)。

正如其他人所提到的,您不需要返回任何东西(也许新的数组大小除外)。

但这会带来另一个问题-根据您的声明

int kar[]= {5, 8, 555, 99};

kar 不能容纳超过4个值-无法扩展为容纳更多值。您要么需要声明kar,其大小应大于4:

int kar[10] = {5, 8, 555, 99};

否则您将需要动态分配该内存并根据需要扩展它:

size_t arr_size = 4;
int *kar = malloc( sizeof *kar * arr_size );

kar[0] = 5;
kar[1] = 8;
kar[2] = 555;
kar[3] = 99;

/**
 * Add 25 to the beginning of the array
 */
append( 25, &kar, &arr_size );

,然后在您的append函数中:

void append( int val, int **array, size_t *size )
{
  /** 
   * Extend the array size by 1.  We assign the result to a temporary in 
   * case realloc fails and returns a NULL - this way we won't lose our 
   * reference the the original memory.  
   *
   * In practice, we would not extend the array one element at a time (realloc
   * can be an expensive operation, so you want to minimize the number of
   * times you call it), but I'm trying to keep the example as simple as
   * I can.  
   */
  int *tmp = realloc( *array, *size + 1 );

  if ( tmp )
  {
    /**
     * Realloc succeeded - update the size and assign tmp back to
     * *array (this is why we needed to pass `array` as an `int **`;
     * we need to update the pointer value).  
     */
    (*size)++;
    *array = tmp;

    /**
     * Shift all elements up one.
     */
    for ( size_t c = *size - 1; c > 0; c-- )
      (*array)[c] = (*array)[c-1];           // we don't want to index into array, we want
                                             // to index into what array *points to*
    /**
     * Add the new value to the beginning of the array
     */
    (*array)[0] = val;
  }
  else
  {
    fprintf( stderr, "Could not extend input array, contents left unchanged\n" );
  }
}

完成后,请确保在main的末尾释放该内存:

free( kar );