我是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;
}
答案 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 );