东北大学在线编程社区problem1672
题目描述:
输入元素个数及数组中的各元素,利用指针将其中所有负数都变为0,输出数组。
//含有错误的代码
#include <stdio.h>
int main(void)
{
int n,i,*p;
scanf("%d",n);
int a[n];
p=a;
for(i=0;i<n;i++){
scanf("%d", *p);
if(*p<0)
*p=0;
printf("%d ", *p);
}
return 0;
}
输入样例:
6
4 3 0 -1 -2 5
输出样例:
4 3 0 0 0 5
经查阅,在C语言中,静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。
在本题中,我们就需要使用动态数组,而在某些编译器中,像题目中那样简单的int a[n];并不奏效,那么我们就需要使用数组指针和malloc()函数来设置数组大小,从而创建动态数组。
//该代码使用Microsoft Visual Stdio2019编写
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n, i, * a;
scanf("%d", &n);
int *p = (int*)malloc(n * sizeof(int));
a = (int*)malloc(n * sizeof(int));
for (i = 0; i < n; i++){
scanf("%d", &a[i]);
p[i] = a[i];
if (p[i] < 0)
p[i] = 0;
printf("%d ", p[i]);
}
return 0;
}
当然,我们也有更简单的写法
//该代码使用Code::Blocks编写
#include <stdio.h>
int main(void)
{
int n, i;
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++){
scanf("%d", &a[i]);
if (a[i] < 0)
a[i] = 0;
}
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
上述两种写法都能顺利运行。
都看到这里了,给个赞呗!