как изменить массив символов в typedef struct из функции? - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь изменить массив из внутреннего набора typedef с помощью функции readset, но он ничего не делает с ним, и я пытаюсь понять, как использовать указатель, чтобы я просто отправил его в функцию, но он не работает как это сделать?

#include <stdlib.h>
#include <string.h>

typedef struct set {
    char a[128];
}set;

 set SETA={""};

void readset (set rset)
{
    char tmp[128];
    int i;
    i=0;
    while(i<128)
        rset.a[i++]='0';
    i=0;
    while(i<128)
        tmp[i++]='0';

        tmp[arr[1]-1]='1';
    strcpy(rset.a, tmp);
    printf("tmp in function is: %s\n",tmp);

}

int main()
{
    int i=0;

    while(i<128)
        SETA.a[i++]='0';
    printf("\n");
    printf("setA before: %s\n",SETA.a);
    readset(setPtr);
    printf("setA after: %s\n",SETA.a);

return 0;
} ```

Ответы [ 3 ]

1 голос
/ 11 января 2020

Скажем, у вас есть структура, определенная так:

typedef struct bar_s
{
    char data[128];
    int someInt;
} bar_t;

Вы бы определили свою функцию следующим образом:

void foo(bar_t* p) //Note the asterisk
{
    strcpy(p->data, "Hello!"); //copy a string into data field
    p->someInt = 0; //assign value to someInt field. Note the "->"
    (*p).someInt = 0; //Same as above, using a dereference operator.
}

Теперь, как вы передаете указатель на эту функцию? Вы могли бы сделать что-то вроде этого:

bar_t sample;
foo(&sample); // & = address-of operator.

Ваша функция readSet нуждается в небольшом количестве работы, чтобы она стала функциональной, но это как работать с указателями в C. В вашем случае вы бы сделали что-то вроде этого:

void readSet(set* rset)
{
    int i = 0;
    for(i = 0; i < 127; ++i)
    {
        rset->a[i] = '0';
    }

    //Note that all strings in C must be terminated with a null character.
    //So, let's put one at the last place in the array.
    rset->a[127] = '\0';
    ...
}
1 голос
/ 11 января 2020

структуры и объединения передаются по значению, поэтому вы можете: https://godbolt.org/z/3NUWHW

  1. Передать его по значению
struct str
{
  char a[100];
  int x;
  /*  ... */
};

struct str read_a(struct str s)
{ 
   strcpy(s.a, "Test");
   return s;
}

int main()
{
   struct str s;
   s.x = 5;
   s = read_a(s);

   printf("s.a=%s, s.x=%d\n",s.a,s.x);
}
Передача по указателю
struct str
{
  char a[100];
  int x;
  /*  ... */
};

struct str *read_a(struct str *s)
{ 
   strcpy(s->a, "Test1");
   return s;
}

int main()
{
   struct str s;
   s.x = 6;
   read_a(&s);

   printf("s.a=%s, s.x=%d\n",s.a,s.x);
}
1 голос
/ 11 января 2020

Либо вам нужно определить отдельный указатель с именем setPtr и назначить адрес SETA непосредственно перед вызовом функции readset, например;

set *setPtr = &SETA;
readset(setPtr);

, либо просто отправить память адрес от SETA до readset;

readset(&SETA);

Между прочим, вам может потребоваться изменить оформление функции, например;

void readset (set *rset) {
    ...
        rset->a[i++]='0';
    ...
}

Кроме того, вы можете использовать символ конца строки (\0) в конце массива char, чтобы функции printf & strcpy выполняли свою задачу должным образом.

...