c - 寻找动态数组中最长的负序列

标签 c

嗯,我写了一段代码,基本上可以做到:

  1. 询问数组长度

  2. 用户将数组输入*p

  3. 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 个属于用户分配的内存区域的值 - 即最后一对 34

通过尝试使用不属于他们的内存,用户会调用未定义的行为,并且程序完全有权利执行绝对任何事情(未定义的行为) - 包括段错误似乎在您的系统上。

所以,别再这样做了。在第一个或两个 while 循环中使用传入指针 arr 的临时副本,或者在同一循环中进行计数和打印。就这么简单。

像计算机一样逐步解决问题是一种不可低估的诊断策略,它可以帮助您真正思考您所编写的内容(如果您还没有这样做的话)。

关于c - 寻找动态数组中最长的负序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34473759/

相关文章:

c++ - if语句中float的转换

c - 如何让多维数组更不容易导致精神错乱?

c - 为什么我不能通过这个指针 hack 找到元素大小?

c++ - Unicode 字符无法从文件中正确加载

c - 为什么使用多个 "if"s 不起作用,但在 while 循环中使用 "if"s 和 "else if"s 却起作用?

c - 如何通过cmd执行C文件

c - pthread 中的函数

c - 如果函数调用本身充当内存屏障,为什么 pthread_mutex_lock() 和 pthread_mutex_unlock() 包含内存屏障?

c - 初始化变量在 for 循环期间跳过 0

c++ - 当我运行曲线匹配代码时,出现错误