C 中的数组操作函数

Array-manipulating functions in C

我对 C 语言编程还很陌生,因此决定尝试一些问题。在尝试它们的过程中,我遇到了一个问题,不确定自己是否做对了。

问题要求创建一个函数,该函数使用用户按照建议提供的整数值列表初始化数组参数。我想我做到了。

此外,大小需要由用户输入确定,最大可能接受的列表大小设置为 200。在让用户输入大小方面,我设法做到了,但在可能的情况下最大尺寸它不起作用。

在这里你可以找到我的代码:

#include <stdio.h>

void init_array(int ar[], int size) {

    int i;
    printf("Please enter %d values: \n");
    for (i = 0; i < size; i++) {
        scanf("%d", &ar[i]);

    }
    printf("Elements in array are:");
    for (i = 0; i < size; i++) {
        printf("%d,  ", ar[i]);
    }
}

int main() {

    int size;
    printf("The size of list:");
    scanf("%d", &size);
    int marks[] = {};
    init_array(marks, size);
    if(size >=200){
        printf(" Limit exceeded");
    }

    return 0;
}

感谢您的帮助

您正在创建一个零长度数组,您应该将主函数更改为如下所示。

int main() {
    int size;
    int marks[200];
    printf("The size of list:");
    scanf("%d", &size);
    if(size < 200){
        init_array(marks, size);
    } else {
        printf(" Limit exceeded");
    }
    return 0;
}

在第一个 printf 语句中,您需要添加 size 作为第二个参数。您还需要在声明数组之前检查限制,并且需要在函数 main 中指定数组的大小(C 中的数组不会根据需要自动增长)。最后,您还应该通过检查 scanf 中的 return 值来验证输入是否为整数。这是修改后的版本:

#include <stdio.h>
#include <stdlib.h>

void read_int(int *i) {
    int n = scanf("%d", i);
    if (n != 1) {
        fprintf(stderr, "Integer expected\n");
        exit(EXIT_FAILURE);
    }
}

void init_array(int ar[], int size) {
    int i;
    printf("Please enter %d values:\n", size);
    for (i = 0; i < size; i++) {
        read_int(&ar[i]);

    }
    printf("Elements in array are: ");
    for (i = 0; i < size; i++) {
        if (i > 0) {
            printf(", ");
        }
        printf("%d", ar[i]);
    }
    putchar('\n');
}

int main(void) {
    const int max_size = 200;
    int size;
    printf("The size of list: ");
    read_int(&size);
    if ((size >= 1) && (size <= max_size)) {
        int marks[size];
        init_array(marks, size);
    } else {
        fprintf(stderr, "Array size must be between 1 and %d\n", max_size);
        exit(EXIT_FAILURE);
    }
    return 0;
}

首先您需要检查大小是否有限制,然后创建所需大小的数组或停止执行程序。

int main() {

    int size;
    printf("The size of list:");
    scanf("%d", &size);
    int marks[size];
    if(size >=200){
        printf(" Limit exceeded");
        return 1;
    }
    init_array(marks, size);
    return 0;
}

您的代码中存在一些重大错误,还有一些方面会产生警告(参见:),应该加以改进。

首先,您在 init_array 函数中首次调用 printf 时省略了 size 参数(对应于给定的 %d 格式说明符)。

其次,您对 marks 的声明是错误的——就目前而言,它正在声明一个零长度的数组(或者更确切地说,试图这样做)。所以,假设你有一个支持可变长度数组的 C 编译器(VLA——大多数支持,但有些,尤其是 MSVC,不支持),你应该将其声明为 int marks[size]; after 您已经阅读了 size 的值(最好是在您确认 size 的给定值是可接受的之后)。另请注意,您不能使用初始化列表( = {0, 1, } 语法)初始化 VLA。如果您不想使用 VLA,那么您可以为数组指定一个固定的(很可能是 200)最大大小。

一些会产生警告的问题 and/or 可以改进:

在 C 中,通常更好的做法(恕我直言)添加一个 explicit void 作为不带参数的函数的正式参数列表。相关阅读:What are the valid signatures for C's main() function? 尽管在函数 definition 中(相对于 prototype),空的 () 是有效代码。

您真的应该养成检查调用 scanf(和相关函数)返回的值的习惯,以确保提供了有效的输入。在下面的代码中,我为 main 函数中的调用添加了这样的检查,但您也应该在 init_array 函数中添加类似的检查。

size 的值超过 200 时,您的程序可能不会 运行 init_array 函数;因此,您应该在初始化 marks 数组之前检查该值。

这是您的代码版本,其中包含我在上面列出的更改:

#include <stdio.h>

void init_array(int ar[], int size)
{
    int i;
    printf("Please enter %d values: \n", size); // You need to give "size" as an argument
    for (i = 0; i < size; i++) {
        scanf("%d", &ar[i]); // You should add a check for valid input here, as I have done in main

    }
    printf("Elements in array are:");
    for (i = 0; i < size; i++) {
        printf("%d,  ", ar[i]);
    }
}

int main(void) // Better with the explicit "void" argument list specifier
{
    int size;
    printf("The size of list:");
    if (scanf("%d", &size) != 1 || size < 1) { // You should ALWAYS check the return value of a scanf call
        printf("Invalid size input.\n");
        return 1;
    }
    int marks[size]; // Need to specify the size and note that you cannot initialize a VLA
//  int marks[200] = { 0, }; // Alternative if not using VLA.
    if (size >= 200) {
        printf(" Limit exceeded.\n");
        return 2;
    }
    init_array(marks, size);
    return 0;
}

请随时询问任何进一步的说明and/or解释。