我如何 return "struct" c 用户定义函数中的数据类型?

How do I return "struct" data types in c user defined function?

我需要读取5个城市名称,我的代码有什么问题,请解释 我不想使用 void 数据类型

//read the 5 city using struct
struct census
{
    char city[20];
    int popullation;
    float literacy;
};

struct census citi[5];
struct census read(struct census citi[]);

main()
{
   int i;
   citi= read(citi);
   for(i=0;i<5;i++)
   {
       printf("%s",citi[i].city);
       printf("\n");
   }
}

struct census read(struct census citi[])
{
    int i;
    for(i=0;i<5;i++)
        gets(citi[i].city);

    return(citi);
}

如何return 使用数据类型 struct 的值,请找出错误并解释错误

您的程序不要求您return read() 函数中的任何内容。不要调用自己的函数read(),因为那是标准函数的名称,所以这样定义会更好

void readCities(struct census *citi, size_t count)
{
    size_t index;
    for (index = 0 ; index < count ; index++)
     {
        fgets(citi[i].city, sizeof(citi[i].city), stdin);
     }
}

main()

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

struct census
{
    char city[20];
    int popullation;
    float literacy;
};
void readCities(struct census *citi);

int main()
{
   size_t        index;
   struct census citi[5];

   readCities(citi, sizeof(citi) / sizeof(*citi));
   for (index = 0 ; index < 5 ; index++)
    {
       printf("%s\n", citi[index].city);
    }
   return 0;
}

上面的代码将初始化 struct,如您所见,您不需要全局变量,除非您真的知道自己在做什么,否则不要使用全局变量,因为@Weather Vane 在下面评论,您可以检查 fgets() 的 return 值和 return 成功读取结构的数量,而不是根本没有 returning,就像这样

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

struct census
{
    char city[20];
    int popullation;
    float literacy;
};
size_t readCities(struct census *citi);

int main()
{
   size_t        index;
   struct census citi[5];
   size_t        count

   count = readCities(citi, sizeof(citi) / sizeof(*citi));
   for (index = 0 ; index < count ; index++)
    {
       printf("%s\n", citi[index].city);
    }
   return 0;
}

size_t readCities(struct census *citi, size_t count)
{
    size_t index;
    size_t successfulCount;

    successfulCount = 0;
    for (index = 0 ; index < count ; index++)
     {
        if (fgets(citi[i].city, sizeof(citi[i].city), stdin) != NULL)
            successfulCount += 1;
     }

    return successfulCount;
}

要么你 return 一个单一的结构

 struct census readCity(void)

并在调用上下文中循环遍历城市数量,或者将指向结构的指针传递给函数:

void readCity(struct census *pCensus)

使用第二个版本,您可以在调用上下文中使用循环

void readCity(struct census *pCensus)
{   
   fgets(pCensus->city, sizeof(pCensus->city), stdin);
}

int main(void)
{
   int i;
   for (i=0; i<5; ++i)
   {
      readCity(&citi[i]); /* pointer to single struct census */
   }
   return 0;
}

或函数本身

void readCity(struct census *pCensus) /* pointer to an array with 5 elements */
{   
   int i;
   for (i=0; i<5; ++i)
   {
      fgets(pCensus->city, sizeof(pCensus->city), stdin);
   }
}

int main(void)
{
   readCity(citi); /* array is converted to a pointer */
   return 0;
}

使用指针更灵活并且可能具有更好的性能,因为它只是指向数据应该读取到的位置的地址。

citi= read(citi); : 无法将值设置为数组本身。
struct census read(struct census citi[])...return(citi); : 不同类型 return 由函数编辑。

如果您想通过将数组传递给函数来更改其内容,则无需 return 数组函数。
如果还 return 一个像 return(citi);.
这样的数组,你必须被指针接收 例如

struct census *read(struct census citi[]);
....
struct census *cities = read(citi);

如果您 return 到一个没有 return 指针的结构,请执行以下操作。

#include <stdio.h>

struct census {
    char city[20];
    int popullation;
    float literacy;
};

struct census read(void);

int main(void){
    struct census citi[5];
    int i;

    for(i=0; i<5; i++)
        citi[i] = read();

    for(i=0; i<5; i++)
        printf("%s\n", citi[i].city);

    return 0;
}

struct census read(void){
    struct census citi;

    scanf("%19[^\n]%*c", citi.city);

    return citi;
}