C 我的fgets实现像fgets一样读取实际内容,但若在文件中找到空字符串,它将读取垃圾?
我已经实现了自己的C 我的fgets实现像fgets一样读取实际内容,但若在文件中找到空字符串,它将读取垃圾?,c,file,null,fgets,C,File,Null,Fgets,我已经实现了自己的fgets(即myfgets)。当我的文件中有空字符串必须由myfgets函数读取时,它会打印所有字符串(好),但有一些垃圾(坏),但如果我使用预定义fgets则没有垃圾。下面是我的代码和文件内容,其中包含空字符串 我的文件 hello wordNULL早上好//如果删除了NULL,那么就好了 #include<stdio.h> #include<stdlib.h> char *myfgets(char *Buffer_address,int size,
fgets
(即myfgets
)。当我的文件中有空字符串必须由myfgets
函数读取时,它会打印所有字符串(好),但有一些垃圾(坏),但如果我使用预定义fgets
则没有垃圾。下面是我的代码和文件内容,其中包含空字符串
我的文件
hello wordNULL早上好//如果删除了NULL,那么就好了
#include<stdio.h>
#include<stdlib.h>
char *myfgets(char *Buffer_address,int size,FILE *fp)
{
register int c;
register char *I_help_Notify_IfNotRead;
I_help_Notify_IfNotRead = Buffer_address;
while(--size>0 && (c=getc(fp))!=EOF )
{
if((*I_help_Notify_IfNotRead++=c)=='\n')
break;
*I_help_Notify_IfNotRead='\0';
}
return ( c==EOF && I_help_Notify_IfNotRead == Buffer_address ) ? NULL : Buffer_address;
}
int main()
{
char ch[100];
FILE *fp ;
fp=fopen("myfile","r");
char * pp=(myfgets(ch,100,fp));
printf("%s",pp);
exit(EXIT_SUCCESS); // No need to close(fp) because exit does for us
}
终止字符串的null逻辑已中断。除最后一个字符外,每个字符后面都写一个NUL字节。将写入NUL的行移动到循环的后面
顺便说一下,我见过比
I\u help\u Notify\u IfNotRead
更糟糕的变量名,但并不经常。out
有什么问题?您的null终止字符串的逻辑已中断。除最后一个字符外,每个字符后面都写一个NUL字节。将写入NUL的行移动到循环的后面
顺便说一下,我见过比
I\u help\u Notify\u IfNotRead
更糟糕的变量名,但并不经常。out
有什么问题?您的null终止字符串的逻辑已中断。除最后一个字符外,每个字符后面都写一个NUL字节。将写入NUL的行移动到循环的后面
顺便说一下,我见过比
I\u help\u Notify\u IfNotRead
更糟糕的变量名,但并不经常。out
有什么问题?您的null终止字符串的逻辑已中断。除最后一个字符外,每个字符后面都写一个NUL字节。将写入NUL的行移动到循环的后面
顺便说一下,我见过比
I\u help\u Notify\u IfNotRead
更糟糕的变量名,但并不经常。out
有什么问题?空字符没有附加在正确的点&。这是主要问题。暗示
if (size > 0) {
while(--size>0 && (c=getc(fp)) != EOF) {
*I_help_Notify_IfNotRead++ = c;
if (c == '\n') break;
}
*I_help_Notify_IfNotRead = '\0';
}
角落案例问题:
如果size==1
,则不写入空字符。(固定在上面)
myfgets()
未实现:“如果在操作过程中发生读取错误,…将返回空指针。”可能:
空字符未附加在正确的点&。这是主要问题。暗示
if (size > 0) {
while(--size>0 && (c=getc(fp)) != EOF) {
*I_help_Notify_IfNotRead++ = c;
if (c == '\n') break;
}
*I_help_Notify_IfNotRead = '\0';
}
角落案例问题:
如果size==1
,则不写入空字符。(固定在上面)
myfgets()
未实现:“如果在操作过程中发生读取错误,…将返回空指针。”可能:
空字符未附加在正确的点&。这是主要问题。暗示
if (size > 0) {
while(--size>0 && (c=getc(fp)) != EOF) {
*I_help_Notify_IfNotRead++ = c;
if (c == '\n') break;
}
*I_help_Notify_IfNotRead = '\0';
}
角落案例问题:
如果size==1
,则不写入空字符。(固定在上面)
myfgets()
未实现:“如果在操作过程中发生读取错误,…将返回空指针。”可能:
空字符未附加在正确的点&。这是主要问题。暗示
if (size > 0) {
while(--size>0 && (c=getc(fp)) != EOF) {
*I_help_Notify_IfNotRead++ = c;
if (c == '\n') break;
}
*I_help_Notify_IfNotRead = '\0';
}
角落案例问题:
如果size==1
,则不写入空字符。(固定在上面)
myfgets()
未实现:“如果在操作过程中发生读取错误,…将返回空指针。”可能:
*I_help_Notify_IfNotRead='\0'代码>应该在循环之后。此外,如果文件为空,则行为未定义(c
未设置);只需删除c==EOF&
。NULL是指NUL字符吗?*I\u help\u Notify\u IfNotRead='\0'代码>应该在循环之后。此外,如果文件为空,则行为未定义(c
未设置);只需删除c==EOF&
。NULL是指NUL字符吗?*I\u help\u Notify\u IfNotRead='\0'代码>应该在循环之后。此外,如果文件为空,则行为未定义(c
未设置);只需删除c==EOF&
。NULL是指NUL字符吗?*I\u help\u Notify\u IfNotRead='\0'代码>应该在循环之后。此外,如果文件为空,则行为未定义(c
未设置);只需删除c==EOF&
。NULL是指NUL字符吗?是的,我同意没有附加NULL字符,但是您的第二条语句“如果在操作过程中发生读取错误,则返回NULL指针”,但是上面的myfgets将返回NULL.in while循环getc()将读取为无符号字符的字符在文件结尾或出错时转换为int或EOF,并且在三元运算符中选中了“c”,不是吗?@user4950013EOF
在文件结尾或出现输入错误时返回。如果返回了EOF
且未读取任何内容,则代码将返回NULL
。根据规范,如果由于输入错误而返回EOF
,fgets()
返回NULL
,无论以前读取的字符数是多少。@user4950013 BTW,而不是说“NULL char”,请使用“NULL character”或'\0'
。将“NULL”保存为NULL
,即“NULL指针常量”。我同意没有附加NULL char,但您的第二条语句“如果在操作过程中发生读取错误,则返回NULL指针”,但上面的myfgets将返回NULL.in while loop getc()将读取为无符号字符的字符在文件结尾或出错时转换为int或EOF,并且在三元运算符中选中了“c”,不是吗?@user4950013EOF
在文件结尾或出现输入错误时返回。如果返回了EOF
且未读取任何内容,则代码将返回NULL
。根据规范,如果由于输入错误而返回EOF
,fgets()
返回NULL
,无论以前读取的字符数是多少。@user4950013 BTW,而不是说“NULL char”,请使用“NULL character”或'\0'
。为NULL
保存“NULL”,即“NULL指针常量”。我同意没有添加NULL字符,但添加了第二个st