编写自己版本的';fgets()';在C中

编写自己版本的';fgets()';在C中,c,file,fgets,C,File,Fgets,我想创建自己版本的函数fgets()。 我试图这样做,但遇到了一些问题。 请告诉我哪里出了问题 #include <stdio.h> #include <stdlib.h> #include <string.h> char *my_fgets(char my_string[], int bytes, const char *filename) { int i = 0; FILE *fp; if ((fp = fopen(filena

我想创建自己版本的函数
fgets()
。 我试图这样做,但遇到了一些问题。 请告诉我哪里出了问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *my_fgets(char my_string[], int bytes, const char *filename) {
    int i = 0;
    FILE *fp;

    if ((fp = fopen(filename, "wb")) == NULL) {
        fprintf(stderr,"Couldn't open the file");
        return NULL;
    }

    while (sizeof(my_string) < bytes || my_string[i] != '\n')
        my_string[i++] = getc(fp);

    my_string[i] = '\0';        //adding NULL character at the end

    /*   using pointers
    char *p;
    for (p = array; p < array + bytes; p++)
        *p = getc(fp);    
    *p = '\0';  */    

    fclose(fp);
    return my_string;    
}

int main() {
    char my_string[15];
    int n;
    char *p;

    p = my_fgets(my_string, sizeof(my_string), stdin);    

    printf("\n%s", my_string);
    printf("\n%s", p);

    return 0;
}
#包括
#包括
#包括
char*my_fgets(char my_string[],int字节,const char*filename){
int i=0;
文件*fp;
if((fp=fopen(文件名,“wb”))==NULL){
fprintf(stderr,“无法打开文件”);
返回NULL;
}
while(sizeof(my|u string)
我的输出没有运行,它立即崩溃。任何帮助都将不胜感激。

您的
fgets()
实现存在许多主要问题:

  • 原型不正确:最后一个参数应该是流指针(
    FILE*
    ),而不是文件名(
    const char*
    )。使用
    stdin
    调用函数,它实际上是一个流而不是文件名。编译器应该对此错误发出警告。IMHO此警告应为错误。启用所有编译器警告,不要忽略它们:
    gcc-Wall-W-Werror

  • 要打开一个文件作为文本读取,您应该使用模式字符串
    “r”
    ,而不是
    “wb”
    ,它将截断文件,但是由于函数应该接收一个
    文件*
    ,这是一个没有意义的问题

  • while(sizeof(my_string)
    中的测试不正确,原因有很多:您应该将
    i
    与数组大小进行比较,而不是将
    sizeof(my_string)
    与常量(指针大小)进行比较,并且应该比较从文件读取的字节,而不是
    my_string[i]
    您尚未向其存储任何内容。此外,您应该使用逻辑and运算符(
    &&
    )来组合这些测试,而不是逻辑or(
    |

  • 最后的
    '\n'
    应该存储到目标数组中

  • 在文件末尾不返回
    NULL

  • 您不会处理缓冲区大小为零的特殊情况

以下是一个改进的版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *my_fgets(char my_string[], int bytes, FILE *fp) {
    int c, i = 0;

    if (bytes <= 0)
        return my_string;

    while (i < bytes - 1 && ((c = getc(fp)) != EOF) {
        my_string[i++] = c;
        if (c == '\n')
            break;
    }
    my_string[i] = '\0'; //adding NUL character at the end

    if (i > 0) {
        return my_string;
    } else {
        return NULL;  // no character read at end of file
    }
}

int main(void) {
    char my_string[15];
    int n;
    char *p;

    p = my_fgets(my_string, sizeof(my_string), stdin);

    printf("%s\n", my_string);
    printf("%s\n", p);

    return 0;
}
#包括
#包括
#包括
char*my_fgets(char my_字符串[],整数字节,文件*fp){
int c,i=0;
如果(字节0){
返回我的_字符串;
}否则{
返回NULL;//文件末尾未读取任何字符
}
}
内部主(空){
char my_字符串[15];
int n;
char*p;
p=我的字符串(我的字符串,sizeof(我的字符串),stdin);
printf(“%s\n”,我的字符串);
printf(“%s\n”,p);
返回0;
}
您的
fgets()
实现存在许多主要问题:

  • 原型不正确:最后一个参数应该是流指针(
    FILE*
    ),而不是文件名(
    const char*
    )。使用
    stdin
    调用函数,它实际上是一个流而不是文件名。编译器应该对此错误发出警告。IMHO此警告应为错误。启用所有编译器警告,不要忽略它们:
    gcc-Wall-W-Werror

  • 要打开一个文件作为文本读取,您应该使用模式字符串
    “r”
    ,而不是
    “wb”
    ,它将截断文件,但是由于函数应该接收一个
    文件*
    ,这是一个没有意义的问题

  • while(sizeof(my_string)
    中的测试不正确,原因有很多:您应该将
    i
    与数组大小进行比较,而不是将
    sizeof(my_string)
    与常量(指针大小)进行比较,并且应该比较从文件读取的字节,而不是
    my_string[i]
    您尚未向其存储任何内容。此外,您应该使用逻辑and运算符(
    &&
    )来组合这些测试,而不是逻辑or(
    |

  • 最后的
    '\n'
    应该存储到目标数组中

  • 在文件末尾不返回
    NULL

  • 您不会处理缓冲区大小为零的特殊情况

以下是一个改进的版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *my_fgets(char my_string[], int bytes, FILE *fp) {
    int c, i = 0;

    if (bytes <= 0)
        return my_string;

    while (i < bytes - 1 && ((c = getc(fp)) != EOF) {
        my_string[i++] = c;
        if (c == '\n')
            break;
    }
    my_string[i] = '\0'; //adding NUL character at the end

    if (i > 0) {
        return my_string;
    } else {
        return NULL;  // no character read at end of file
    }
}

int main(void) {
    char my_string[15];
    int n;
    char *p;

    p = my_fgets(my_string, sizeof(my_string), stdin);

    printf("%s\n", my_string);
    printf("%s\n", p);

    return 0;
}
#包括
#包括
#包括
char*my_fgets(char my_字符串[],整数字节,文件*fp){
int c,i=0;
如果(字节0){
返回我的_字符串;
}否则{
返回NULL;//文件末尾未读取任何字符
}
}
内部主(空){
char my_字符串[15];
int n;
char*p;
p=我的字符串(我的字符串,sizeof(我的字符串),stdin);
printf(“%s\n”,我的字符串);
printf(“%s\n”,p);
返回0;
}

Standard
fgets()
不打开文件;除非导师给了你严格的要求,否则你的也不应该。请注意,while(sizeof(my_string)的循环是错误的。大小是指针中的字节数(可能是4或8),并且不会改变。
my_string[i]!='\n'
:尚未确定值(
my_string[i]
)。
应为
第三个参数类型为
const char*filename
stdin
文件*
。标准
fgets()
不打开文件;除非导师给了你严格的要求,否则你的也不应该。请注意,while(sizeof(my_string)的循环是错误的。大小是指针中的字节数(可能是4或8),并且不会改变。
my_string[i]!='\n'
:尚未确定值(
myu字符串[i]
)。
应为