我一直在尝试从文件中读取输入,但似乎某些内容无法正常工作......而不是阅读单词" Words"在文本中,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个字符?我该怎么办?
答案 0 :(得分:1)
memset(c, 0, sizeof(c));
主要是因为它是char*
,那么sizeof(c)将取决于编译细节......
而且这个测试也是错误的:
if(w->name=c)
你可能想要
if(strcmp(w->name,c) == 0)
终止缓冲区后,用' \ 0'。
此外,您应检查不要溢出缓冲区,否则结果将无法预测。
答案 1 :(得分:1)
缩进意味着您没有以正确的可读方式安排代码。
我假设您正在尝试逐行逐字地存储单词并从文本文件中逐字存储。但是我无法弄清楚你的insert()函数是做什么的。此外,这段代码有很多错误。
我先列出它们,然后你就可以说出你在这方面做了什么。
search(s)->file
指针参数中的。
原型是:void search(struct word * w,FILE * f)。
您必须执行以下操作:
这只是我给出的解决方案,你缺乏这方面的知识。您必须在using files in c.
声明if(w->name=c)
:
网上有很多资源,可以准确回答你想做的事情。您可以使用Google搜索。我只能指出这么多错误,因为你的整个代码都有错误。了解更多我会说。
答案 2 :(得分:1)
我没有研究过代码的逻辑,所以我只想指出一些的问题:
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
这是一个负值。
普通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));
Pointless不会检查分配失败。这应该是(在我看来):
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)
是无操作,所以此清理适用于上述所有分支。
search(s);
search()
函数需要第二个参数(FILE *
)。
printres(s);
(未定义的功能)