[英]error while reading input from file c
我一直在尝试从文件中读取输入,但是似乎某些内容无法正常工作...与其读取文本中存在的单词“单词”,printf始终显示不包含在其中的2个其他随机字符文件...
该函数是:
void search(struct word *w,FILE *f){
char *c;
char c2;
int i,j,k,l;
c=(char*)malloc(120*sizeof(char));
i=1;
while(f!=NULL) {
c2=fgetc(f);
while(c2!=EOF) {
while(c2!='\n') {
k=0;
while(c2!=' ') {
*(c+k)=c2;
k=k+1;
c2=getc(f);
}
if(w->name==c)
insert(i,j+1,name,&w);
}
memset(c, 0, sizeof(c));
j=j+k+1;
}
i=i+1;
}
}
}
主要功能是
int main()
{
struct word *s;
s=(struct word*)malloc(sizeof(struct word));
s->name=(char*)malloc(20*sizeof(char));
s->result=NULL;
scanf("%s",s->name);
search(s);
printres(s);
system("pause");
exit(0);
}
和结构是
struct position
{
char *filename;
int line;
int place;
struct position *next;
};
struct word
{
char *name;
struct word *right;
struct word *left;
struct position *result;
};
为什么会出现这些另外的2个字符? 我该怎么办?
乍一看,这对我来说似乎是错的
memset(c, 0, sizeof(c));
主要是因为c是char*
,所以sizeof(c)将取决于编译细节...而且此测试也是错误的:
if(w->name=c)
你可能想要
if(strcmp(w->name,c) == 0)
用'\\ 0'终止缓冲区后。
另外,您应该检查缓冲区是否溢出,否则结果将不可预测。
缩进意味着您没有以正确易读的方式排列代码。
我假设您正在尝试逐行和逐个单词地存储文本文件中的单词。 但是我无法确定您的insert()函数的作用。 此外,此代码有很多错误。
我将首先列出它们,然后您可以说出您在做什么。
在main()中:缺少search(s)->file
指针参数。
原型是:无效搜索(结构词* w,FILE * f)。
您必须执行以下操作:
语句if(w->name=c)
:
网上将有很多资源,这些资源将对您想要做的事情有确切的答案。 您可以使用Google搜索。 我只能指出这么多的错误,因为您的整个代码到处都是错误。 了解更多我想说的。
我还没有研究过代码的逻辑,所以我只想指出一些问题:
c=(char*)malloc(120*sizeof(char));
这里的演员大部分都是无用的。 当您尝试分配错误类型的数据时,它可以用来警告您,但是许多人建议使用以下方式分配内存:
c = malloc (120 * sizeof *c);
无论c
的实际类型如何,这都会自动分配120个大小合适的项目。 您还应该检查malloc()
的返回值。 分配可能会失败。
char c2;
c2=fgetc(f);
while(c2!=EOF) {
fgetc()
函数返回一个带signed int
值,该值表示一个unsigned char
或EOF
(负值)范围内的unsigned char
。
纯char
与signed char
或未unsigned char
兼容。 如果它是unsigned
,则它将永远无法存储EOF
的值,因此比较c2 != EOF
将始终为false。 如果已signed
,则它可以(通常不是必须)存储EOF
,但是它将具有与实际字符相同的值。
您应该将fgetc()
的返回值存储在int
变量中,将其与EOF
进行比较,然后将其转换为char
。
if(w->name==c)
这是要进行字符串比较吗? 在C中,这种方式行不通。您只是在比较指针。 要比较实际的字符串,您必须调用strcmp()
或类似的字符串。
insert(i,j+1,name,&w);
(未定义的函数)
memset(c, 0, sizeof(c));
我假设您正在尝试将整个缓冲区设置为0
,但是大小是错误的。 这会将sizeof (char *)
字节而不是您分配的120
个字节清零。
s=(struct word*)malloc(sizeof(struct word));
s->name=(char*)malloc(20*sizeof(char));
没有意义的人对分配失败进行不检查。 这应该是( 我认为 ):
s = malloc (sizeof *s);
if (s) {
s->name = malloc (20 * sizeof *s->name);
}
if (s && s->name) {
/* Go to work */
} else {
/* Allocation failure */
}
/* All done. Free memory. */
if (s) {
free (s->name);
}
free (s);
由于free(0)
是no-op,因此此清理适用于上面的所有分支。
search(s);
search()
函数需要第二个参数( FILE *
)。
printres(s);
(未定义的函数)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.