嗯,我写了一段代码,基本上可以做到:
询问数组长度
用户将数组输入*p
longestNeg 函数检查最长的负序列。
它的作用:返回最长的负序列及其值。
问题:在longestNeg函数中(抛出异常)
if (*arr < 0) {
counter++;
}
问题:为什么会发生这种情况?
问题2:威尔 while (arr < arr + n)
工作?
编辑3:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void longestNeg(int *arr, int n);
int main()
{
int *arr1, n,num = 0,*p;
printf("Please enter the size of the array: ");
scanf("%d", &n);
arr1 = (int*)malloc(n * sizeof(int));
if (arr1 == NULL)
printf("Not enough memory\n");
else printf("Array was allocated!\n" );
for (p = arr1; p < arr1 + n; p++)
{
scanf("%d", p);
}
longestNeg(p - n, n);
free(arr1);
getch();
}
void longestNeg(int *arr, int n)
{
int counter = 0, temp = 0, *p;
for (p = arr; p < arr + n; p++)
{
if (*p < 0) {
counter++;
}
else if (counter > temp) {
temp = counter;
counter = 0;
}
else
counter = 0;
}
if (counter != 0)
for (p = arr; p < arr + counter; p++)
{
printf("%d ", *p);
}
else
printf("No neg numbers.");
}
最佳答案
.....要计算负数,您需要将 arr
递增到它们之上,同时检查它们是否为负数,如果是负数,则经过 counter
。然后,您尝试从 arr
打印 counter
数字,该数字现在指向负序列之后。
所以,想一想。想象一下你是一台计算机。人类输入了1, 2, -1, -2, -3, -4, 3, 4
。您向上计数并递增超过 4 个负数。您的指针 arr
现在指向倒数第二个值 3
。然后,用户要求您打印从 3
开始的 counter
== 4 个值。 但是只剩下 2 个属于用户分配的内存区域的值 - 即最后一对 3
和 4
。
通过尝试使用不属于他们的内存,用户会调用未定义的行为,并且程序完全有权利执行绝对任何事情(未定义的行为) - 包括段错误似乎在您的系统上。
所以,别再这样做了。在第一个或两个 while
循环中使用传入指针 arr
的临时副本,或者在同一循环中进行计数和打印。就这么简单。
像计算机一样逐步解决问题是一种不可低估的诊断策略,它可以帮助您真正思考您所编写的内容(如果您还没有这样做的话)。
关于c - 寻找动态数组中最长的负序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34473759/