发送结构数组以起作用

时间:2014-07-08 20:10:32

标签: c function structure

为了完成一个更大的项目,我试图了解如何发送一个结构数组,以及一个char *类型的标记到一个函数。我的这段代码的目的是做以下事情:

  • 打开文件
  • tokenize file
  • 发送令牌和结构数组以搜索功能
  • 搜索功能将通过arrayofstructures,使用strcmp查找与令牌匹配
    • 如果匹配发现返回1,则主函数将检查1或0
    • 如果为0,则不将令牌添加到结构数组中,如果1将令牌添加到arrayof结构

我刚刚编写了一个小程序,看看我是否可以发送数组,并将令牌发送到一个函数并进行比较,但由于我不理解大多数错误,因此我失去了很多错误。

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

int search(struct id array[],char* tok);

struct id
{
    char name[20];
    int age;
};

int main(void)
{
    struct id person[2] = { {"John Smith", 25},
                            {"Mary Jones", 32} };
    char* token = "Mary Jones"; /*char* for strtok() return type*/
    search(person,token);
}

int search(struct id array[],char* tok)
{
    int i,value;int size = 2;
    for(i=0;i<size;i++)
    {
        if(strcmp(array[i].name,tok) == 0)
            value = 0;
        else
            value = 1;
    }
    return value;
}

3 个答案:

答案 0 :(得分:2)

放置

int search(struct id array[],char* tok);  
struct声明之后

。并将search的返回值分配给int变量。

int found = search(person,token);  
if(found == 0)
    printf("Name is found\n"); // or whatever you want

答案 1 :(得分:0)

以下是您应该使用的代码。

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

struct id
{
    char name[20];
    int age;
};

int search( const struct id array[], size_t n, const char *tok );

int main( void )
{
    struct id person[2] = { {"John Smith", 25},
                            {"Mary Jones", 32} };
    char* token = "Mary Jones"; /*char* for strtok() return type*/

    printf( "%d\n", search( person, sizeof( person ) / sizeof( *person ), token ) );

    return 0;
}


int search( const struct id array[], size_t n, const char *tok )
{
    size_t i = 0;

    while ( i < n && strcmp( array[i].name, tok ) != 0 ) ++i;

    return n != 0 && i != n;
}
编辑:我删除了一些拼写错误。

输出

1

这是已找到的名称。

考虑到如果找到名称,正确的函数搜索必须返回1。:)

答案 2 :(得分:0)

在定义指向它们的指针或在函数声明中使用它们之前,总是声明结构/枚举/联合,如下所示:

struct id;

额外的提示,同时引入一个与标签名称具有相同ID的typedef-name:

typedef struct id id;

在首次使用之前始终声明函数,如下所示:

int search(struct id array[],char* tok);

在使用结构/枚举/联合之前,请始终定义结构/枚举/联合,但第一条规则涵盖的内容如下:

struct id {
    char name[20];
    int age;
};

使用typedef-name:

typedef struct id { /**/ } id;

现在,在可能的情况下,将定义放在您需要提交前向声明的地方 唯一的例外:如果你把声明放在一个头文件中,那很好 这减少了多余的冗余。


更多观察结果:

  • 不要对名称等使用固定大小的字段。它们总是太短。
  • 永远不要修改字符串文字,不注意禁止会导致未定义的行为,你的程序就变得毫无意义了。改为使用副本。

    /* Most implementations supply this non-standard function */
    char* strdup(const char* s) {
      size_t n = strlen(s)+1;
      char* p = malloc(n);
      if(p) memcpy(p, s, n);
      return p;
    }
    
  • 当您传递一个数组时,实际上只是将指针传递给它的第一个元素,所以也传递一个元素数。
    • 类型size_tssize_t专为此项目而设计。
    • 如果您有一个名为a的数组,则使用sizeof a / sizeof *a获取元素计数。请确保它不是指针!
  • 早期回归是好的:尽早回归成功 那么你就没有机会忘记你在下一次循环迭代中的成功(就像发生在你身上一样),除了更快。