首页 > 解决方案 > 续:从文件中索引单词的程序的分段错误

问题描述

我遇到了一个应该索引从文件中读取的单词的程序的分段错误。我更改了我尝试创建动态数组的代码的第一部分,意识到数组不能是动态的。以前,我曾经遇到分段错误,但现在程序编译但甚至无法正常运行。我非常感谢一些反馈。我上一篇文章的链接是 从文件中索引单词的程序的分段错误

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

int main (int argc, char *argv[])
{
    //Check if the usage is correct
    if (argc != 2)
    {
        printf("Usage: ./test15 text\n");
        return 1;
    }

    //Main program
    char *file = argv[1];
    FILE *ptr = fopen(file, "r");
    char ch;
    int i = 0;
    int k = 0;
    int j = 0;
    char *text = malloc(sizeof(char));

    while ((ch = fgetc(ptr)) != EOF)
    {
        text[i] = ch;
        if (ch == ' ')
        {
            k++;
        }
        i++;
    }

    char *word[k];
    i = 0;
    int l = 0;

    while ((ch = fgetc(ptr)) != EOF)
    {
        text[i] = ch;
        if (ch == ' ')
        {
            for (int m = j; m < i; m++)
            {
                int d = i - j;
                strncat(word[l], &text[m], d);
            }
            j = i + 1;
            l++;
        }
        i++;
        printf("%s\n", word[l]);
    }
    return 0;
}

标签: c

解决方案


char *text = malloc(sizeof(char));

您为单个 char. text本质上是一个单元素数组。

然后在下面的循环中,如果文件中有多个字节,您将超出这个单元素数组的范围。这会导致未定义的行为

此外

char *word[k];

在这里,您定义了一个未初始化的指针数组。尝试取消引用这些指针也会导致未定义的行为

并且当您使用strcat-like 函数时,目标指针必须是指向有效的以空字符结尾的字符串的指针。


另一方面,该fgetc函数返回一个int. 这实际上对于与 的比较非常重要EOF


推荐阅读