【问题标题】:C function returning different values while calling from main functionC函数从主函数调用时返回不同的值
【发布时间】:2019-01-10 19:07:19
【问题描述】:

我编写了一个从文件中读取值的程序。文件中的数据格式如下。

    100       Full Name       SomeDetails.

    234       Full Name       SomeDetails

以下是我编写的程序。

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 10
struct student
{
int rollno;
char name[20];
char course[25];
};

int main()
{
FILE *fptr;
fptr=fopen("records.txt","r");
struct student s[10];
int i=0,tstudent=0;
char che;
char line[100];

//SECTION : 1.1 -> READING NUMBER OF LINES

while(!feof(fptr))
{
    che=fgetc(fptr);
    if(che=='\n')
    {
        tstudent++;
    }
}

printf("Total Lines in File = %d\n",tstudent);
fclose(fptr);


    //SECTION : 1.2 -> READING RECORDS FROM FILE

fptr=fopen("records.txt","r");
char newString[20][20];
int ii,j,ctr;
j=0;
ctr=0;
for(i=0; i<tstudent; i++)
   {

       fgets(line,100,fptr);
       printf("Value of Line %d = %s",i,line);
       for(ii=0; ii<=(strlen(line)); ii++)
       {
           // if tab or NULL found, assign NULL into newString[ctr]
           if(line[ii]=='\t'||line[ii]=='\0')
           {
               newString[ctr][j]='\0';
               ctr++;  //for next word
               j=0;    //for next word, init index to 0
           }
           else
           {
               newString[ctr][j]=line[ii];
               j++;
           }
       }

   }

   for(ii=0; ii < ctr; ii++)
   {
       printf("\n%s",newString[ii]);
   }

   printf("Value of ctr = %d",ctr);
   fclose(fptr);
   }

上面的代码工作正常,但所有代码都在主函数中,但我想创建一个单独的函数,可以从主文件中调用,并将文件的每个数据以二维或一维数组作为返回值返回.

任何帮助/建议将不胜感激。

我尝试将 CODE 作为一个单独的函数来使用.. 不工作。

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

 char readfile(int tstudent,FILE* filename)
 {

 //FUNCTION TO READ RECORDS FROM FILE.

FILE *fptr;
int i,k;
char line[100];    
char newString[20][20];
int j=0,ctr=0;
fptr=fopen("records.txt","r");
for(i=0; i<tstudent; i++)
{
    fgets(line,100,fptr);
    printf("Value of Line %d = %s",i,line);
    for(k=0; k<=(strlen(line)); k++)
    {
        // if tab or NULL found, assign NULL into newString[ctr]
        if(line[k]=='\t'||line[k]=='\0')
        {
            newString[ctr][j]='\0';
            ctr++;  //for next word
            j=0;    //for next word, init index to 0
        }
        else
        {
            newString[ctr][j]=line[k];
            j++;
        }
    }
}
return newString;
}

我在主函数中定义了一个新变量 char results[].. 并尝试如下调用该函数

 results[]=readfile(tstudent,fptr)

但是当试图读取结果时..它显示垃圾

【问题讨论】:

  • 不要向我们展示 工作 代码。显示 非工作 之一。请正确格式化。
  • 两点:请看Why is while ( !feof (file) ) always wrong?。而char che 应该是int che,因为这是fgetc 返回的类型。
  • @EugeneSh。我已将我尝试过的代码添加为单独的函数,但它不起作用。
  • return newString; - 我怀疑。您不能返回本地定义的数组。没有寻找其他问题。
  • @EugeneSh。我在主函数中定义了一个新变量 char results[] .. 并尝试将该函数称为 results[]=readfile(tstudent,fptr).. 但是在尝试读取结果时.. 它显示垃圾。

标签: c arrays function multidimensional-array


【解决方案1】:
char readfile(int tstudent,FILE* filename)
   ...
   char newString[20][20];
   ...
   return newString;

这不是一件好事,对吧?您将readFile 定义为返回一个字符(不是指针,只是一个字节),然后返回一个数组。我们不应该对编译器抱怨感到惊讶。

如果您“修复”重新定义返回类型,您仍然会遇到问题,因为newString 是一个自动局部变量。它定义的存储(内存)在函数之外是未定义的。

函数在 C 中填充结构(或数组)的最简单方法是调用者将其作为函数参数传递。所以你最终会得到类似的东西:

int readfile( FILE* input, char newString[][20], int tstudent )

newString 的定义方式与您的定义相同,但由调用者定义,而不是在 readfile 中。参照。像fgets这样的stdio函数;他们中的大多数要求调用者定义他们读入的缓冲区。

我只是指出几个错误。

每当你调用一个函数——尤其是一个 I/O 函数——检查错误。您可能想阅读tstudent 记录,但有多少?如果你要 5 却只找到 1,那又如何呢?您的读取循环必须测试文件结尾,并且 readfile 必须返回读取的记录数,否则调用者永远不会知道。与 fread(3) 的工作方式进行比较。那些 Unix 人知道如何定义函数的一两件事!

现在你的函数看起来像这样:

int readfile( FILE* input, char newString[][20], int tstudent ) {
  char line[100], *s;
  int i=0;

  for( ; i < tstudent && (s = fgets(line, sizeof(line), input)) != NULL; i++ ) {
    /* do stuff with line */ 
  }
  /* check for EOF/error if s is NULL, and report */
  return i;
}

【讨论】:

  • 你能用简单的单词解释一下我应该如何处理代码吗?我只是 C 的新学生。
  • 我使用了我所知道的最简单的语言,Mohd。写作需要时间;如果你想了解,很多答案都在那里。另一个可能会有所帮助的想法:您似乎认为您可以从 C 中的函数返回一个数组。您不能。该数组应在 main 中定义并传递给函数。您可以返回一个指向动态分配数组的指针(使用 malloc),但这更高级,在这里没有必要。
  • 非常感谢,感谢您消除我们无法从函数返回数组作为其返回值的疑问。我希望你明白我只是 C 的新手(实际上是整个编程世界的新手)。因此,根据您的建议,我应该在主函数中定义一个数组,并将其作为参数传递给 readFile 函数。请让我知道我们是否可以返回与返回值相同的数组?或者如何实现目标?
  • 就像 fgets 一样:你的函数接收缓冲区作为参数,填充它,然后返回。它填充了缓冲区,调用者将看到缓冲区已填充。它必须,因为它是同一个缓冲区。它可能在 main 中有一个名称,在 readfile 中有另一个名称,但它是同一个缓冲区。从技术上讲,传递的不是“缓冲区”而是指针;在 CS 中通常称为“按引用传递”。使用返回值来显示读取了多少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
相关资源
最近更新 更多