gpt4 book ai didi

c - 传递 'functions' 的参数 1 从一个没有转换的整数中生成一个指针

转载 作者:太空宇宙 更新时间:2023-11-04 07:43:39 24 4
gpt4 key购买 nike

我必须编写一个函数来请求一个数组及其大小,然后打印它的值。主函数必须调用另外两个函数,它们都带有两个参数(一个数组及其大小)。第一个请求值来填充数组,第二个打印每个值。

我是 C 和一般编程的新手,因此非常欢迎任何提示和有用的信息。我对指针也知之甚少。

void requestarray(int a[], int  size){       
int i;
for (i=0;i<size;i++)
{
printf("Insert value for %d position of the array\n",i);
scanf("%d\n",&a[i]);
}
}

void printarray(int a[], int size){
int i;

for (i=0;i<size;i++){
printf("%d\n",a[i]);
}
}

int main(void){
int size;

printf("Insert array length\n");
scanf("%d\n",&size);

int a[size];
requestarray(&a[size],size);
printf("\n");
printf("The array is\n");
printarray(&a[size],size);

return 0;
}

程序编译但不工作。当我使用 gdb 调试它时,我在

之后放置了一个断点
 int a[size];

然后我打印 a 的值,它返回一个具有 size 长度和随机值(主要是大数字)的数组。然后我在

之后放置一个断点
requestarray(&a[size],size);

(它应该修改数组的值)但它返回与前一个断点中打印的相同的值。

如果我像这样更改主函数中的代码

 requestarray(a[size],size);
printf("\n");
printf("The array is\n");
printarray(a[size],size);

调试器给我这个警告

arreglo1.c: In function ‘main’:
arreglo1.c:33:14: warning: passing argument 1 of ‘requestarray’ makes pointer from integer without a cast [-Wint-conversion]
resquestarray(a[size],size);
^
arreglo1.c:8:6: note: expected ‘int *’ but argument is of type ‘int’
void requestarray(int a[], int size){
^~~~~~~~~~~~
arreglo1.c:36:16: warning: passing argument 1 of ‘imprimearreglo’ makes pointer from integer without a cast [-Wint-conversion]
printarray(a[size],size);
^
arreglo1.c:17:6: note: expected ‘int *’ but argument is of type ‘int’
void printarray(int a[], int size){
^~~~~~~~~~~~

最佳答案

scanf ("%d\n", &a[i]); 完全错误(请注意必须按 Enter 或提供比预期更多的输入?)scanf 不会以这种方式处理转义字符。相反,文字 '\n' 会导致 scanf 忽略所有空白,迫使您在返回之前输入非空白字符。

无论您键入什么导致 scanf 返回的字符,都不匹配您的格式字符串 中的任何内容,导致该字符未读stdin 中并将用作您下一次尝试的输入。

这就是为什么...,您必须通过检查每个使用的输入函数的返回值验证每个输入。例如在 main() 中,例如

    printf ("Insert array length: ");
if (scanf ("%d", &size) != 1) { /* validate EVERY input */
fputs ("error: invalid integer input.\n", stderr);
exit (EXIT_FAILURE);
}

然后在 requestarray() 中再次出现,例如

    for (i = 0; i < size; i++) {
printf ("Insert value for %d position of the array: ", i + 1);
if (scanf ("%d", &a[i]) != 1) { /* validate EVERY input */
fputs ("error: invalid integer input.\n", stderr);
exit (EXIT_FAILURE); /* handle error condition as desired */
}
}

否则,在匹配输入 失败时,scanf 会停止从您的输入缓冲区中提取字符(此处为stdin ),有问题的字符留在您的输入缓冲区中,等待在您下次调用 scanf 时导致同样的失败。

当你传递一个数组时,你可以简单地使用一个指针,因为数组在访问时被转换为一个指针,参见:C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) .所以你可以简单地编写你的函数:

void requestarray (int *a, int  size)
{
int i;

putchar ('\n'); /* tidy up with newline before looping for input */

for (i = 0; i < size; i++) {
printf ("Insert value for %d position of the array: ", i + 1);
if (scanf ("%d", &a[i]) != 1) { /* validate EVERY input */
fputs ("error: invalid integer input.\n", stderr);
exit (EXIT_FAILURE); /* handle error condition as desired */
}
}
}

(注意传递 int a[] 没有错。还要注意代码的间距如何更宽一些,使其更易于阅读(尤其是对于老年人的眼睛..))

总而言之,您可以这样做:

#include <stdio.h>
#include <stdlib.h> /* for EXIT_FAILURE define */

void requestarray (int *a, int size)
{
int i;

putchar ('\n'); /* tidy up with newline before looping for input */

for (i = 0; i < size; i++) {
printf ("Insert value for %d position of the array: ", i + 1);
if (scanf ("%d", &a[i]) != 1) { /* validate EVERY input */
fputs ("error: invalid integer input.\n", stderr);
exit (EXIT_FAILURE); /* handle error condition as desired */
}
}
}

void printarray (int *a, int size)
{
int i;

for (i = 0; i < size; i++){
printf ("%d\n", a[i]);
}
}

int main(void) {

int size;

printf ("Insert array length: ");
if (scanf ("%d", &size) != 1) { /* validate EVERY input */
fputs ("error: invalid integer input.\n", stderr);
exit (EXIT_FAILURE);
}

int a[size]; /* Variable Length Array of 'size' elements */

requestarray (a, size);

puts ("\nThe array is\n"); /* there is no convertion, puts will do */
printarray (a ,size);

return 0;
}

示例使用/输出

$ ./bin/inputarray
Insert array length: 5

Insert value for 1 position of the array: 1
Insert value for 2 position of the array: 2
Insert value for 3 position of the array: 3
Insert value for 4 position of the array: 4
Insert value for 5 position of the array: 5

The array is

1
2
3
4
5

检查一下,如果您还有其他问题,请告诉我。

关于c - 传递 'functions' 的参数 1 从一个没有转换的整数中生成一个指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58575263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com