c将struct传递给方法进行更新

时间:2013-03-15 01:14:40

标签: c methods struct

我在使用以下代码段时遇到了一些问题:

#include <stdio.h>

struct some_numbers 
{
int id;
char *somestring;
};

typedef struct some_numbers numb;

void print_numbers(numb *a)
{
printf("%d: %s\n", a->id, a->somestring);
}

void add_number(numb *a)
{

 // do someting magical
 // push the new result to the existing struct
 // put something into like:
  a->somestring[5] = "widdley";
}

int main(void)
{

// put some stuff in the struct
numb entries[50];
int x;
for(x=0; x < 4; x++)
{
    numb a = entries[x];
    a.id = x;
    a.somestring = "goats";
    print_numbers(&a);
}

add_numbers(&a);  // i want to call a method 

return 0;
}

我想创建一个结构数组,将结构传递给方法,并将更多项目放入数组中。到目前为止,我尝试过的所有事情都失败了,我很难想出解决这个难题的方法。我可以毫无问题地打印这些值:

> ./struct 
0: goats
1: goats
2: goats
3: goats
> 

我希望输出看起来像:

> ./struct 
0: goats
1: goats
2: goats
3: goats
4: widdley
>

请帮忙。我不擅长c,所以要温柔!

编辑:澄清了代码示例,将焦点从错误的区域中移除。

3 个答案:

答案 0 :(得分:3)

下面:

a->somestring[5] = "widdley";

somestring[5]的类型为char,而不是char*。如果需要字符串数组,则需要定义:

struct some_numbers {
  int id;
  char *somestring[20];  // 20 is an example
};

以某种方式管理这些字符串取决于你的实际目标。

如果您想在entries中添加新号码,请使用4个以上的项目进行定义,并跟踪有效位置:

numb entries[20]; // 20 is an example
int num_entries = 0;
entries[num_entries++] = new_entry(); // some function that returns an entry

或者只使用动态数组,这需要动态内存管理(malloc / realloc);

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
struct some_numbers 
{
  int id; 
  char *somestring;
};

typedef struct some_numbers numb;

void print_numbers(numb *a) {
  printf("%d: %s\n", a->id, a->somestring);
}

void add_entry(numb **list, int *n, int id, const char *str) {
  int cnt = *n; 
  *list = realloc(*list, sizeof(numb)*(cnt + 1));
  (*list)[cnt].id = id; 
  (*list)[cnt].somestring = malloc(strlen(str)+1);
  strcpy((*list)[cnt].somestring, str);
  *n = cnt + 1;
}

int main(void)
{

  // put some stuff in the struct
  numb *entries = 0;
  int x, num_entries=0;
  for(x=0; x < 4; x++)
  {
    add_entry(&entries, &num_entries, x, "goats");
  }

  for (x=0; x<num_entries; x++)
    print_numbers(&entries[x]);
  printf("\n\n");
  add_entry(&entries, &num_entries, 6, "widdley"); 
  for (x=0; x<num_entries; x++) 
    print_numbers(&entries[x]);

  return 0;
}

答案 1 :(得分:1)

如果要向阵列添加更多值,则需要预先分配足够的内存以存储最大可能的结构数,或者动态分配内存。所以:

numb entries[100];

或者

numb *entries = malloc(sizeof(numb)*100);

然后,您需要将变量传递给add_number函数以跟踪数组的结束位置:

void add_number(numb *a, int position) {
        a[position].somestring = "widdley";
}

答案 2 :(得分:0)

你注释掉了对add_numbers()的调用,当然,数组中的结构不会改变。我怀疑你这样做是因为你收到编译器错误。 a->somestring[5] = "widdley";应为a->somestring = "widdley";,因为您要设置整个字符串的值,而不是该字符串中的一个字符。将来,请发布您获得的任何编译器错误。在对代码进行一次更改后,您应该在调用add_numbers()之后打印出数组