0

次のコード スニペットに問題があります。

#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苦手なので優しくしてね!

編集: コード例を明確にして、間違った領域からフォーカスを外しました。

4

3 に答える 3

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;
}
于 2013-03-15T01:18:33.483 に答える
1

配列にさらに値を追加する場合は、可能な最大数の構造体を格納するのに十分なメモリを前もって割り当てるか、メモリを動的に割り当てる必要があります。そう:

numb entries[100];

または

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

次に、変数を add_number 関数に渡して、配列の終了位置を追跡する必要があります。

void add_number(numb *a, int position) {
        a[position].somestring = "widdley";
}
于 2013-03-15T01:37:26.960 に答える
0

への呼び出しをコメントアウトしたadd_numbers()ので、もちろん、配列内の構造体は変更されません。コンパイルエラーが発生しているため、これを行ったと思われます。その文字列の1文字だけでなく、文字列全体の値を設定したいので、そうするa->somestring[5] = "widdley";必要があります。a->somestring = "widdley";今後、コンパイル エラーが発生した場合は投稿してください。コードにこの 1 つの変更を加えた後、を呼び出したadd_numbers()に配列を出力する必要があります。

于 2013-03-15T01:20:31.847 に答える