提问人:Volk 提问时间:7/11/2023 最后编辑:Vlad from MoscowVolk 更新时间:7/11/2023 访问量:79
我在函数中找不到错误
I can't find a mistake in the function
问:
我正在用 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);
}
}
我需要帮助来寻找我的错误。
答:
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) {
跳过第一条记录。
请注意,一般来说,文件中的记录可以大于或等于字符。例如,如果文件中的记录恰好包含字符加上换行符,则函数会将此记录视为两条记录:记录的新行符将被视为分隔的第二条空记录。100
99
'\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);
}
}
评论
string
只是一个指针;它需要指向一些内存,例如,char string[100];
cat
fgets()
printf()
fgets()
fread()
fwrite()