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”,不是吗?@user4950013
EOF
在文件结尾或出现输入错误时返回。如果返回了
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”,不是吗?@user4950013
EOF
在文件结尾或出现输入错误时返回。如果返回了
EOF
且未读取任何内容,则代码将返回
NULL
。根据规范,如果由于输入错误而返回
EOF
fgets()
返回
NULL
,无论以前读取的字符数是多少。@user4950013 BTW,而不是说“NULL char”,请使用“NULL character”或
'\0'
。为
NULL
保存“NULL”,即“NULL指针常量”。我同意没有添加NULL字符,但添加了第二个st