我在使用以下代码段时遇到了一些问题:
#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,所以要温柔!
编辑:澄清了代码示例,将焦点从错误的区域中移除。
答案 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()
之后打印出数组。