C语言 我找不到函数中的错误

fae0ux8s  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(147)

我用C写了一个模拟的linux comand cat,但是我找不到函数内部的错误,它必须计算非空字符串。我得到:segmentation fault,当我使用这个函数时(代码如下):

void output_opt1_file(char *name_file) // функция открывает файл и нумерует только не пустые строки
{
    FILE *f = fopen(name_file, "rt");

    if (f != NULL) {
        char *string;
        fgets(string, 100, f);
        int i = 1;
        while (fgets(string, 100, f) != NULL) {
            if (strlen(string) == 0) //if (string[0] == '\n')
            {
                printf("%s", string);//puts(string);
            }
            else
            {
                printf("%d%c", i, ' ');
                ++i;
                printf("%s", string);//puts(string);                    
            }
        }
        fclose(f);
    }
}

字符串
我需要帮助寻找我的错误。

bvk5enib

bvk5enib1#

你的代码是错误的,至少有两个原因。
第一个原因是指针string未初始化。

char *string;

字符串
您需要声明一个字符数组而不是指针,例如

char string[100];


第二个问题是这个if语句

if (strlen(string) == 0)


永远不会评估为逻辑true,因为函数fgets至少可以从文字档读取新的行字符'\n'做为空字串。
你可以写

if ( string[0] == '\n')


while循环之前的这个调用

fgets(string, 100, f);
    int i = 1;
    while (fgets(string, 100, f) != NULL) {


将跳过第一条记录。
请注意,一般情况下,文件中的一条记录可以大于或等于100个字符。例如,如果档案中的记录正好包含99个字符加上新行字符'\n',则您的函数会将此记录视为两个记录:记录的新行字符将被认为是分开的第二个空记录。

ql3eal8s

ql3eal8s2#

工作版本:

void output_opt1_file(char *name_file)
{
    FILE *f = fopen(name_file, "rt");
    if (f != NULL) {
        char string[100];
        int i = 1;
        while (fgets(string, 100, f) != NULL) {
            if (string[0] == '\n')
            {
                printf("%s", string);
            }
            else
            {
                printf("%d%c", i, ' ');
                ++i;
                printf("%s", string);                    
            }
        }
        fclose(f);
    }
}

字符串

相关问题