编写自己版本的';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*
调用函数,它实际上是一个流而不是文件名。编译器应该对此错误发出警告。IMHO此警告应为错误。启用所有编译器警告,不要忽略它们:stdin
gcc-Wall-W-Werror
- 要打开一个文件作为文本读取,您应该使用模式字符串
,而不是“r”
,它将截断文件,但是由于函数应该接收一个“wb”
,这是一个没有意义的问题文件*
中的测试不正确,原因有很多:您应该将while(sizeof(my_string)
与数组大小进行比较,而不是将i
与常量(指针大小)进行比较,并且应该比较从文件读取的字节,而不是sizeof(my_string)
您尚未向其存储任何内容。此外,您应该使用逻辑and运算符(my_string[i]
)来组合这些测试,而不是逻辑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*
调用函数,它实际上是一个流而不是文件名。编译器应该对此错误发出警告。IMHO此警告应为错误。启用所有编译器警告,不要忽略它们:stdin
gcc-Wall-W-Werror
- 要打开一个文件作为文本读取,您应该使用模式字符串
,而不是“r”
,它将截断文件,但是由于函数应该接收一个“wb”
,这是一个没有意义的问题文件*
中的测试不正确,原因有很多:您应该将while(sizeof(my_string)
与数组大小进行比较,而不是将i
与常量(指针大小)进行比较,并且应该比较从文件读取的字节,而不是sizeof(my_string)
您尚未向其存储任何内容。此外,您应该使用逻辑and运算符(my_string[i]
)来组合这些测试,而不是逻辑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;
}
Standardfgets()
不打开文件;除非导师给了你严格的要求,否则你的也不应该。请注意,while(sizeof(my_string)my_string[i]!='\n'
:尚未确定值(my_string[i]
)。
应为
第三个参数类型为const char*filename
但stdin
为文件*
。标准fgets()
不打开文件;除非导师给了你严格的要求,否则你的也不应该。请注意,while(sizeof(my_string)my_string[i]!='\n'
:尚未确定值(myu字符串[i]
)。
应为