c - 段。逐行读取故障

标签 c segmentation-fault

我正在尝试计算每行出现次数最多的众数或整数。

我打印了两个值,然后出现了段错误。

        for (i = 0; i < count; i++) {

            if (array[i]) {
                int i, j, k, cnt = 1, p, big;
                int b[MAX_NUM] = {0};
                printf("count:%d\n", count);
                for (i = 1; i <= array[i]; i++) {
                    for (j = i + 1; j <= array[i]; j++) {
                        if (array[i] == array[j])
                            printf("cnt:%d\n", cnt);
                        cnt++;
                    }
                    printf("cnt2:%d\n", cnt);
                    b[k] = cnt;
                    k++;
                    cnt = 1;
                }        
                big = b[k];
                p = 1;

                for (i = 2; i <= array[i]; i++) {
                    if (big < b[i]) {
                        big = b[i];
                        p = i;
                    }
                }
                printf("The element that occurs offen is %d\n", array[p]);
                printf("And it has occurred %d times\n", b[p]);
            }
        }
    }
}
}

return 0;
}

编辑:

查看我的代码中的外观。打印的值是文件每行上的数字,后跟一个空行,如下所示:

1
2
3
4
5
6
5
4
5

14
62
48
14
1
3
5
7
9

123
456
789
1234
5678

34
34
34
34
34

1

1
2
2
2
2
2
3
3
4
4
4
4
5
5
6
7
7
7
1
1

Integers: 9
.....

最佳答案

您在内部作用域中重新定义了 ip,它们遮盖了当前定义。这显然是无意的,因为 for 表达式看起来很错误:

if (array[i]) {
    int i, j, k=1, cnt = 1, p, big;
    //  ^
    //  Redefinition of i.
    //  You should use a different name for the loop index below
    //  Same remark for p, it is safer to not redefine local variables
    //  in inner scopes.  Any { starting a block creates a new scope
    //  in which variables can be defined, or in this case redefined.
     ...
    for (i = 1; i <= array[i]; i++) {
        ...
    for (i = 2; i <= array[i]; i++) {
        ...

在代码的同一区域中,您无需事先初始化即可使用 k

计算最大出现次数的代码可以放入一个单独的函数中并以这种方式简化:

#include <stdio.h>

// get the number of ocurrences of val in array a of size n
int get_number_of_occurrences(int a[], int n, int val) {
    int cnt = 0, i;

    for (i = 0; i < n; i++) {
        if (a[i] == val)
            cnt++;
    }
    return cnt;
}

// return the index for the number that occurs the most
int get_max_occurrence_index(int a[], int n) {
    int p = 0, cnt, max = 0, i;

    for (i = 0; i < n; i++) {
        cnt = get_number_of_occurrences(a, n, a[i]);
        if (max < cnt) {
            max = cnt;
            p = i;
         }
     }
     return p;
}

int main() {
    int i, n, a[20], max;

    printf("Enter the maximum number of elements\n");
    scanf("%d", &n);
    printf("Enter the elements\n");
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    i = get_max_occurrence_index(a, n);
    max = get_number_of_occurrences(a, n, a[i]);
    printf("The element that occurs most oftenly is %d\n", a[i]);
    printf("And it has occurred %d times\n", max);
    return 0;
}

如果您想在原始程序中使用此逻辑,则应在读取文件时在每一行使用它,而不是在仅适用于最后一行的结尾处使用它。行解析代码也不正确:您将第一个数字的 ASCII 值作为值,而不是使用 strtol() 进行解析。

这是更正后的版本:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define MAX_NUM 1000
#define MAX_LINE_LEN 2048
#define N 100

void fatal(const char *msg) {
    printf("%s\n", msg);
    exit(1);
}

int main(int argc, char *argv[]) {
    FILE *fp;
    char filename[100];
    char line[MAX_LINE_LEN];
    char *p;
    int array[MAX_NUM];
    int index, count, max;

    printf("Please enter the file name: \n");

    if (scanf("%99s", filename) != 1) {        
        fatal("Error in entering file.");
    }

    if ((fp = fopen(filename, "r")) == NULL) {
        fatal("Unable to open the file.");
    }

    while ((p = fgets(line, MAX_LINE_LEN, fp)) != NULL) {
        /* skip white space */
        p += strspn(p, " \t\n");
        if (*p == '#' || *p == '\0') {
            /* ignore comment and blank lines */
            continue;
        }
        /* scan and convert the numbers */
        for (count = 0; *p != '\0'; ) {
            if (isdigit((unsigned char)*p)) {
                array[count++] = strtol(p, &p, 10);
                printf("%d\n", array[count]);
            } else {
                /* skip to next space or end of string */
                p += strcspn(p, " \t\n");
            }
            /* skip white space after the number */
            p += strspn(p, " \t\n");
        }

        index = get_max_occurrence_index(array, count);
        max = get_number_of_occurrences(array, count, array[index]);

        printf("The element that occurs most often is %d\n", array[index]);
        printf("And it has occurred %d times\n", max);
    }
    fclose(fp);
    return 0;
}

关于c - 段。逐行读取故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34957726/

相关文章:

c - 请帮我找到代码中的错误(段错误)

c - for循环表达式中的常量存储在计算机内存中的什么位置?

c - 是否有内置的方法来解析 C 中用户提供的字符串中的标准转义序列?

c - Malloc - 为什么该字符串接受具有较小分配的文本?

c - 使用 3D 动态数组的函数中出现段错误

c - 无限递归 main() 中出现段错误后的不同运行时间

c - 最新测试版中的 Swift C void* 和 void** 指针 (4)

c - 如何突破fgets?

mysql - 使用c连接到mysql数据库时出现段错误

c: 在子进程中运行的 exec() 中捕获一个段错误