我在这个问题上遇到了一些麻烦。问题全文如下:“编写一个函数,返回给定非负整数数组的一个版本,其中数组中的每个零值都替换为数组中零右侧的最小奇数值. 如果零的右边没有奇数,则将零作为零。
这是我的代码:
#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]
的有效索引是0
to 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 i
is size - 1
(同样,有效索引是0
to size - 1
)。
这是任务
if (num[i] = 0)
你想要比较的地方
if (num[i] == 0)
注意
scanf("%d", &size);
for (i = 0; i < size; i++) {
scanf("%d", &myarr[i]);
如果用户输入的值大于20
for ,则存在相同的越界访问风险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] 删除。
我来说两句