c将结构传递给方法以进行更新

c将结构传递给方法以进行更新,c,methods,struct,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 someti

我对以下代码段有一些问题:

#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
4: widdley
>
请帮忙。我不擅长c,所以温柔点

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

此处:

a->somestring[5] = "widdley";
somestring[5]
的类型是
char
,而不是
char*
。如果需要字符串数组,则需要定义:

struct some_numbers {
  int id;
  char *somestring[20];  // 20 is an example
};
并根据您的实际目标以某种方式管理这些字符串

如果要在
条目中添加新编号
,请使用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)

#包括
#包括
#包括
构造一些_数
{
int-id;
char*somestring;
};
typedef结构一些_数字麻木;
无效打印编号(编号*a){
printf(“%d:%s\n”,a->id,a->somestring);
}
无效添加项(编号**列表,整数*n,整数id,常量字符*str){
int cnt=*n;
*list=realloc(*list,sizeof(NUM)*(cnt+1));
(*列表)[cnt].id=id;
(*list)[cnt].somestring=malloc(strlen(str)+1);
strcpy((*list)[cnt].somestring,str);
*n=cnt+1;
}
内部主(空)
{
//在结构中放一些东西
numb*entries=0;
int x,num_条目=0;
对于(x=0;x<4;x++)
{
添加_项(&entries,&num_项,x,“山羊”);
}
对于(x=0;x此处:

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

struct some_numbers {
  int id;
  char *somestring[20];  // 20 is an example
};
并根据您的实际目标以某种方式管理这些字符串

如果要在
条目中添加新编号
,请使用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)

#包括
#包括
#包括
构造一些_数
{
int-id;
char*somestring;
};
typedef结构一些_数字麻木;
无效打印编号(编号*a){
printf(“%d:%s\n”,a->id,a->somestring);
}
无效添加项(编号**列表,整数*n,整数id,常量字符*str){
int cnt=*n;
*list=realloc(*list,sizeof(NUM)*(cnt+1));
(*列表)[cnt].id=id;
(*list)[cnt].somestring=malloc(strlen(str)+1);
strcpy((*list)[cnt].somestring,str);
*n=cnt+1;
}
内部主(空)
{
//在结构中放一些东西
numb*entries=0;
int x,num_条目=0;
对于(x=0;x<4;x++)
{
添加_项(&entries,&num_项,x,“山羊”);
}

对于(x=0;x您注释掉了对
add_numbers()
的调用,因此当然,数组中的结构不会更改。我怀疑您这样做是因为您遇到了编译器错误。
a->somestring[5]=“widdley”
应该是
a->somestring=“widdley”
因为您想设置整个字符串的值,而不仅仅是该字符串中的一个字符。以后,请发布您得到的任何编译器错误。在对代码进行这一更改后,您应该在调用
add_numbers()

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

如果要向数组中添加更多值,需要预先分配足够的内存以存储尽可能多的结构,或者动态分配内存。因此:

numb entries[100];

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

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

如果要向数组中添加更多值,则需要预先分配足够的内存以存储尽可能多的结构,或者动态分配内存。因此:

numb entries[100];

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

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

您注释掉了对
add_numbers()
的调用,因此当然,数组中的结构不会更改。您还应该在进行更改后打印出数组。是的,这不是问题所在,我的add_numbers方法被破坏了。“破坏”是什么意思?您注释掉了对
add_numbers()的调用
,因此当然,数组中的结构不会更改。您也应该在更改后打印出数组。是的,这不是问题,我的add_number方法已损坏。“损坏”是什么意思你的意思是?你认为我知道的比我多。你能给我一个更完整的动态数组的例子来完成我的任务吗?在答案中添加了一些细节,效果非常好!现在我只需要通过这段代码来理解你做了什么,以及我错在哪里。非常感谢。你认为我知道的比我多。你能给我一些答案吗一个更完整的动态数组示例可以完成我的任务?在回答中添加了一些细节,效果非常好!现在我只需要通过这段代码来了解您所做的事情,以及我的错误所在。非常感谢。我在尝试实现您的建议时遇到了一些问题。在添加编号后添加了此内容:for(y=0;y<6;y++){numba=entries[y];print_numbers(&a)}@MikePerez请用您的更改编辑您的原始问题,并包括您遇到的新问题。我在尝试实施您的建议时遇到了一些问题。在添加_numbers:for(y=0;y<6;y++){numba=entries[y];print_numbers(&a)}@MikePerez请用您的更改编辑您的原始问题,并包括您遇到的新问题。