如何从函数更改 typedef struct 中的字符数组?
how to change a character array in typedef struct from a function?
我正在尝试通过函数 readset 更改数组 a inside set of typedef 但它没有对它做任何事情
我试图了解如何使用指针,所以我只是将它发送给函数,但它不起作用
怎么做?
#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;
} ```
要么你需要定义一个单独的指针命名为setPtr
并分配SETA
的地址,就在调用函数readset
之前,如;
set *setPtr = &SETA;
readset(setPtr);
或者,将SETA
的内存地址发送到readset
;
readset(&SETA);
顺便说一句,您可能还需要更改函数装饰,例如;
void readset (set *rset) {
...
rset->a[i++]='0';
...
}
此外,您可以在 char 数组的末尾使用字符串终止符 ([=18=]
),以使 printf
和 strcpy
函数正确执行任务.
假设你有一个结构,定义如下:
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] = '[=13=]';
...
}
结构和联合按值传递,因此您可以:https://godbolt.org/z/3NUWHW
- 按值传递
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);
}
我正在尝试通过函数 readset 更改数组 a inside set of typedef 但它没有对它做任何事情 我试图了解如何使用指针,所以我只是将它发送给函数,但它不起作用 怎么做?
#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;
} ```
要么你需要定义一个单独的指针命名为setPtr
并分配SETA
的地址,就在调用函数readset
之前,如;
set *setPtr = &SETA;
readset(setPtr);
或者,将SETA
的内存地址发送到readset
;
readset(&SETA);
顺便说一句,您可能还需要更改函数装饰,例如;
void readset (set *rset) {
...
rset->a[i++]='0';
...
}
此外,您可以在 char 数组的末尾使用字符串终止符 ([=18=]
),以使 printf
和 strcpy
函数正确执行任务.
假设你有一个结构,定义如下:
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] = '[=13=]';
...
}
结构和联合按值传递,因此您可以:https://godbolt.org/z/3NUWHW
- 按值传递
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);
}