繁体   English   中英

从文件c读取输入时出错

[英]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()函数的作用。 此外,此代码有很多错误。

我将首先列出它们,然后您可以说出您在做什么。

  1. 在main()中:缺少search(s)->file指针参数。

    原型是:无效搜索(结构词* w,FILE * f)。

    您必须执行以下操作:

    • 首先使用fopen()函数打开文件。
    • 使用从步骤i获得的指针。 并将其作为参数插入到search()函数中。

    这只是我提供的解决方案,您对此并不了解。 您将不得不阅读有关使用c中文件的更多信息

  2. 语句if(w->name=c)

    • 它是“ ==”而不是“ =”。 在这里,您仅将w-> name分配为c。
    • 您正在尝试比较指针而不是指针中的字符! 比较指针将无济于事。 您为两者分配了不同的内存,地址如何相同? 阅读有关在c中比较字符串的更多信息
    • 比较之前,您必须以'\\ 0'(空字符)终止字符串。 这通常会导致以其他方式打印不需要的字符。

网上将有很多资源,这些资源将对您想要做的事情有确切的答案。 您可以使用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 charEOF (负值)范围内的unsigned char

charsigned 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM