我在函数中找不到错误

I can't find a mistake in the function

提问人:Volk 提问时间:7/11/2023 最后编辑:Vlad from MoscowVolk 更新时间:7/11/2023 访问量:79

问:

我正在用 C 编写模拟 linux comand cat,但我在函数中找不到错误,它必须对非空字符串进行数字化。 当我使用这个函数时,我得到:分割错误(代码如下):

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);
    }
}

我需要帮助来寻找我的错误。

C 函数 while 循环 换行符 fgets

评论

3赞 Vlad from Moscow 7/11/2023
您正在使用未初始化的指针字符串:char *string;。要在哪里读取文件中的记录?
4赞 ad absurdum 7/11/2023
string只是一个指针;它需要指向一些内存,例如,char string[100];
1赞 Jonathan Leffler 7/11/2023
请注意,“real”命令不用于读取数据或写入数据,因为它必须处理包含空字节的文件。空字节混淆了使用 .它可能用于阅读和写作。catfgets()printf()fgets()fread()fwrite()
0赞 Volk 7/11/2023
谢谢你的帮助!现在它正在工作。但是我找不到非空字符串计数的解决方案......我使用字符串长度的条件。如果长度等于 0,则字符串打印 ( stdin)。我试过puts(string),在我改变printf后......但我再次得到了所有数字字符串。

答:

1赞 Vlad from Moscow 7/11/2023 #1

您的代码是错误的,至少有两个原因。

第一个是指针未初始化。string

char *string;

您需要声明一个字符数组,而不是像 examples 那样的指针

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) {

跳过第一条记录。

请注意,一般来说,文件中的记录可以大于或等于字符。例如,如果文件中的记录恰好包含字符加上换行符,则函数会将此记录视为两条记录:记录的新行符将被视为分隔的第二条空记录。10099'\n'

评论

0赞 Volk 7/11/2023
弗拉德,之前我用了 fgetc,我忘了删除这个字符串,我只是改了...... :(我有第一个符号的版本,但我评论了这个变体......因为我找不到带有指针的解决方案 ))) 现在,这部分正在工作。多谢!
0赞 Vlad from Moscow 7/11/2023
@Volk 完全没有。不客气:)
0赞 Volk 7/11/2023 #2

它的工作版本:

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);
    }
}