当我输入一个字母时,我的函数可以工作,但是当我输入一个整数时它不会

Posted

技术标签:

【中文标题】当我输入一个字母时,我的函数可以工作,但是当我输入一个整数时它不会【英文标题】:When I enter a letter, my function works but when I enter an integer it doesnt 【发布时间】:2022-01-16 14:32:17 【问题描述】:

我正在尝试创建一个函数,该函数将要求用户输入一个数字以确定数组的大小,然后将数字输入到数组中。然后我需要打印数组并交换其中的最小和最大数字。这是C语言的


#include <stdio.h>

void read_array();
void display_array();

void read_array(int arr[])

    int Size;
    printf("Enter the desired size of the array: ");
    scanf("%d", &Size);
    
    for(int i = 0; i < Size; i++)
    
        printf("\nEnter a number for position %d:", i);
        scanf("%d", &arr[i]);
        getchar();
    


int main()

    int size;
    int arr[size];
    
    read_array(arr[size]);
    

    return 0;

【问题讨论】:

当你在C中使用标签时,已经很清楚你在使用c,不需要用c语言编写这段代码,也不需要附加部分display_array()。 int size; int arr[size]; 无效 - 您正在使用未定义的长度定义可变长度数组。要么选择您的程序可以处理的最大数组大小,要么动态分配数组,或者在定义数组之前读取大小 数组大小在创建时是固定的,您使用未初始化的可变大小创建它。代码read_array(arr[size]);也应该有编译错误,检查你的编译器消息。 必须 始终检查scanf返回的值。在这种情况下,您可以使用for(int i = 0; i &lt; Size &amp;&amp; scanf("%d", arr + i) == 1; i += 1) ... 。 (假设您修复了 arr 的初始化,如其他 cmets 中所述)。不需要getchar%d 转换说明符将使用前导空格。 【参考方案1】:

关于数组的创建,您有 3 个选项(按我自己的喜好排序)。

在这个例子中,get_array_size() 是一个函数,它返回用户输入的元素数量,process_array() 对创建的数组做一些事情(比如用更多的用户输入填充它)。

1.) 使用固定长度数组

int array[10];
unsigned int size = get_array_size();

if (size > 10) 
    printf("Size is too large.\n");
    exit(1);


process_array(array, size);

这样做的好处是始终清楚您的程序将消耗多少内存:int 大小的 10 个元素。

显然,如果用户输入的数字小于10(在此示例中),则数组的其余部分将被“浪费”。

2.) 在堆上分配数组

unsigned int size = get_array_size();

// It's still advised to "cap" the max. size of your array
if (size > 32) 
    printf("Won't allocate: size is too large.\n");
    exit(1);


int *array;

array = calloc(size, sizeof(int));

if (!array) 
    printf("Could not allocate memory!\n")
    exit(1);


process_array(array, size);
free(array);

注意free()函数的使用。

这里只会分配需要/请求的内容(如果用户输入5,则只会分配5元素)。

缺点是一旦你完成分配的内存,你必须free()

即使在这里,仍然非常建议设置元素的最大数量(例如,您不希望您的程序为不需要要求的简单任务分配 4GB 内存> 它)

3.) 在栈上分配数组

unsigned int size = get_array_size();

// It's still advised to "cap" the max. size of your array
if (size > 32) 
    printf("Won't allocate: size is too large.\n");
    exit(1);


int array[size];

process_array(array, size);

除了你不用free() 使用后的内存之外,与选项2 相同。但是,其他限制也起作用(您不能从函数中返回这样分配的数组),并且您绝对不想溢出堆栈。

所以你看,无论你选择哪个选项:实际上总是需要强制执行最大值,所以我会尽可能选择第一个选项(考虑堆栈大小)。

在所有情况下,process_array 函数都可以以相同的方式实现(该函数不关心内存来自哪里):

void process_array(int *array, unsigned int size) 
     for (unsigned int i = 0; i < size; ++i) 
          // do something with array[i]
     

底线是:如果你想用 C 编程,你真的必须了解这些概念。如果这对您来说太多了,请选择另一种为您处理内存的语言。

【讨论】:

以上是关于当我输入一个字母时,我的函数可以工作,但是当我输入一个整数时它不会的主要内容,如果未能解决你的问题,请参考以下文章

Python-如何使用 re 匹配整个字符串 [重复]

SearchView 忽略大写字母

字母输入运行无限循环

当我使用 regasm 时,所有参数都输入为输入?那可以改变吗?

函数 MOD 上的 Excel 错误

我的 C 程序不断崩溃