返回给定数组的一个版本的函数,其中数组中的每个零值都被 0 右侧的最小奇数值替换。在 C 中

外传的

我在这个问题上遇到了一些麻烦。问题全文如下:“编写一个函数,返回给定非负整数数组的一个版本,其中数组中的每个零值都替换为数组中零右侧的最小奇数值. 如果零的右边没有奇数,则将零作为零。

这是我的代码:

#include <stdio.h>

void lowestOdd(int num[], int size) {
    int i, temp;
    for (i = 0; i < size; i++) {
        if (num[i] % 2 != 0 && num[i] < num[i + 1]) {
            temp = num[i];
        }
    }

    for (i = 0; i < size; i++) {
        if (num[i] = 0) {
            num[i] = temp;
        }
    }
}

void printArray(int array[], int size) {
    int i;
    for (i = 0; i < size; i++) {
        printf("%d/n", array[i]);
    }
}

int main() {
    int i, size;
    int myarr[20];
    printf("What is the size of your array? \n");
    scanf("%d", &size);

    for (i = 0; i < size; i++) {
        scanf("%d", &myarr[i]);
    }
    lowestOdd(myarr[20], size);
    printArray(myarr[20], size);
    return 0;
}

我尝试在最低奇函数中实现指针,但无济于事。我确实认为他们在这里是必要的,但我并不擅长指针。我得到的警告主要是“警告:传递 'lowestOdd' 的参数 1 使指针来自整数而没有强制转换 [-Wint-conversion]”。另外,在我的代码中,我没有添加语句来检查数字是否为零或零右侧是否有任何奇数值。

原因

声明中

int myarr[20];

myarr标识符- 用于引用数组本身的名称。myarr类型 int [20]

在此表达式中使用时

lowestOdd(myarr[20], size);

[20]数组下标运算符,访问索引20这是索引超出范围,因为该类型 int [20]的有效索引是0to 19这种越界访问将导致Undefined Behavior

这个警告

warning: passing argument 1 of 'lowestOdd' makes pointer from integer without a cast [-Wint-conversion]

给出是因为,尽管要访问的索引无效,但表达式 myarr[20]的计算结果为int. lowestOdd期望 anint *作为它的第一个参数。

与之前类似,在

if (num[i] % 2 != 0 && num[i] < num[i + 1])

num[i + 1]将访问num[size]when iis size - 1(同样,有效索引是0to size - 1)。

这是任务

if (num[i] = 0)

你想要比较的地方

if (num[i] == 0)

注意

scanf("%d", &size);

for (i = 0; i < size; i++) {
    scanf("%d", &myarr[i]);

如果用户输入的值大于20for ,存在相同的越界访问风险size


暂时忽略越界访问,lowestOdd尝试从数组中的每对数字中找到较小数字的最后一次出现,其中左边的数字必须是奇数。

然后它用这个值替换数组中的所有零。

有机会temp永远不会分配任何东西,因此具有不确定的价值。

这是不正确的。


这是一个示例程序(使用可变长度数组)。

请注意,语法array + i等价于&array[i].

? :条件运算符:在 中a ? b : c,如果a为非零,则表达式计算为b,否则计算为c

#include <stdio.h>

int min(int a, int b)
{
    return a < b ? a : b;
}

int find_lowest_odd(int *base, size_t len)
{
    int value = 0;

    for (size_t i = 0; i < len; i++)
        if (base[i] & 1) /* base[i] % 2 != 0 */
            value = value ? min(value, base[i]) : base[i];

    return value;
}

void mutate_array(int *a, size_t len)
{
    for (size_t i = 0; i < len; i++)
        if (0 == a[i])            /* search from the next position */
            a[i] = find_lowest_odd(a + i + 1, len - i - 1);
}

void print_array(int *a, size_t len)
{
    for (size_t i = 0; i < len; i++)
        printf("%d ", a[i]);

    putchar('\n');
}

int main(void) {
    size_t size;

    printf("What is the size of your array?: ");

    if (1 != scanf("%zu", &size))
        return 1;

    int array[size];

    for (size_t i = 0; i < size; i++) {
        printf("#%zu: ", i + 1);

        if (1 != scanf("%d", array + i))
            return 1;
    }

    print_array(array, size);
    mutate_array(array, size);
    print_array(array, size);
}

输入/输出:

What is the size of your array?: 10
#1: 0
#2: 2
#3: 0
#4: 5
#5: 3
#6: 0
#7: 7
#8: 2
#9: 0
#10: 0
0 2 0 5 3 0 7 2 0 0
3 2 3 5 3 7 7 2 0 0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章