更改结构中元素的值
Changing the value of an element in a struct
我是结构新手。我正在尝试编写一个具有结构的程序,该结构应该存储一个字符数组及其长度。我希望能够更改长度的值,因为我将创建 trimming/concatenating 数组之类的函数。这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
struct strstruct{
unsigned int length;
char string[20];
};
typedef struct strstruct stru;
int strleng(stru A){
int i=0;
while(A.string[i]!='[=10=]'){
i++;
}
A.length =i;
return i;
}
int main(){
stru A = {1,
{'a','b','c','d','e','f'}
};
printf("%d %d\n",strleng(A),A.length);
return 0;
}
尽管调用了 strleng
,A.length
的值没有改变。
(i)为什么?
(ii) 还有其他方法吗?
对于初学者来说,函数调用中参数的求值顺序是未指定的。
所以在这次通话中
printf("%d %d\n",strleng(A),A.length);
参数表达式 A.length
的计算可以在调用函数 strleng
之前发生,反之亦然。
其次函数strleng
声明为
int strleng(stru A);
处理在 main 中声明并用作参数的原始对象 A
的副本。所以更改副本不会影响原始对象。
您需要通过指向对象的指针按引用传递对象。
unsigned int strleng( stru *A){
unsigned int i=0;
while(A->string[i]!='[=12=]'){
i++;
}
A->length =i;
return i;
}
主要是你应该这样写
unsigned int n = strleng( &A );
printf("%u %u\n", n, A.length );
注意一方面,数据成员length
被声明为unsigned int
类型
unsigned int length;
另一方面,在您的原始函数 strleng
中,您使用的是带符号类型 int
的对象,并且函数 return 类型也是 int
。该函数至少应使用相同的类型 unsigned int
而不是 int
.
试试下面的代码:
#include <stdio.h>
#include <stdlib.h>
struct strstruct{
unsigned int length;
char string[20];
};
typedef struct strstruct stru;
int strleng(stru* A){
int i=0;
while(A->string[i]!='[=10=]'){
i++;
}
A->length =i;
return i;
}
int main(){
stru A = {1,
{'a','b','c','d','e','f'}
};
printf("%d %d %d\n",A.length, strleng(&A),A.length);
printf("%d \n",A.length);
return 0;
}
您将得到输出:6 6 1
。我现在应该得到答案了。
At first, you need to use pointer as a parameter if you want to modify struture's value inner a fucntion.
For your question:
- To most of the c compiler, the functions inner a printf function is prcessed from right to left. I think the compiler in your case is this one.
- For some c compiler, it do process functions in one line from left to right.
希望对你有所帮助,c在线编译:https://www.onlinegdb.com/online_c_compiler.
printf("%d %d\n",strleng(A),A.length);
- 首先,在这里你将参数作为值传递给strleng函数意味着strleng函数的参数是A的copy。换句话说,主变量A strleng函数内部的函数和结构体变量是两个自变量。因此,在 strleng 函数中更改 A.length 对主函数中的变量 A 不可见。 (有很多关于按值传递与按引用传递的优秀在线资源。您可以查看这些资源以更好地理解)
- 大多数编译器从右到左获取printf() 的每个参数。所以这里 A.length 先执行再执行 strleng(A)。所以即使你通过引用传递参数,它仍然会输出 6 1.
更新代码
#include <stdio.h>
#include <stdlib.h>
struct strstruct {
unsigned int length;
char string[20];
};
typedef struct strstruct stru;
int strleng(stru* A) {
int i = 0;
while(A->string[i] != '[=11=]'){
i++;
}
A->length = i;
return i;
}
int main() {
stru A = {1, {'a','b','c','d','e','f'}};
printf("%d %d %d\n", A.length, strleng(&A), A.length);//6 6 1
return 0;
}
我是结构新手。我正在尝试编写一个具有结构的程序,该结构应该存储一个字符数组及其长度。我希望能够更改长度的值,因为我将创建 trimming/concatenating 数组之类的函数。这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
struct strstruct{
unsigned int length;
char string[20];
};
typedef struct strstruct stru;
int strleng(stru A){
int i=0;
while(A.string[i]!='[=10=]'){
i++;
}
A.length =i;
return i;
}
int main(){
stru A = {1,
{'a','b','c','d','e','f'}
};
printf("%d %d\n",strleng(A),A.length);
return 0;
}
尽管调用了 strleng
,A.length
的值没有改变。
(i)为什么?
(ii) 还有其他方法吗?
对于初学者来说,函数调用中参数的求值顺序是未指定的。
所以在这次通话中
printf("%d %d\n",strleng(A),A.length);
参数表达式 A.length
的计算可以在调用函数 strleng
之前发生,反之亦然。
其次函数strleng
声明为
int strleng(stru A);
处理在 main 中声明并用作参数的原始对象 A
的副本。所以更改副本不会影响原始对象。
您需要通过指向对象的指针按引用传递对象。
unsigned int strleng( stru *A){
unsigned int i=0;
while(A->string[i]!='[=12=]'){
i++;
}
A->length =i;
return i;
}
主要是你应该这样写
unsigned int n = strleng( &A );
printf("%u %u\n", n, A.length );
注意一方面,数据成员length
被声明为unsigned int
unsigned int length;
另一方面,在您的原始函数 strleng
中,您使用的是带符号类型 int
的对象,并且函数 return 类型也是 int
。该函数至少应使用相同的类型 unsigned int
而不是 int
.
试试下面的代码:
#include <stdio.h>
#include <stdlib.h>
struct strstruct{
unsigned int length;
char string[20];
};
typedef struct strstruct stru;
int strleng(stru* A){
int i=0;
while(A->string[i]!='[=10=]'){
i++;
}
A->length =i;
return i;
}
int main(){
stru A = {1,
{'a','b','c','d','e','f'}
};
printf("%d %d %d\n",A.length, strleng(&A),A.length);
printf("%d \n",A.length);
return 0;
}
您将得到输出:6 6 1
。我现在应该得到答案了。
At first, you need to use pointer as a parameter if you want to modify struture's value inner a fucntion.
For your question:
- To most of the c compiler, the functions inner a printf function is prcessed from right to left. I think the compiler in your case is this one.
- For some c compiler, it do process functions in one line from left to right.
希望对你有所帮助,c在线编译:https://www.onlinegdb.com/online_c_compiler.
printf("%d %d\n",strleng(A),A.length);
- 首先,在这里你将参数作为值传递给strleng函数意味着strleng函数的参数是A的copy。换句话说,主变量A strleng函数内部的函数和结构体变量是两个自变量。因此,在 strleng 函数中更改 A.length 对主函数中的变量 A 不可见。 (有很多关于按值传递与按引用传递的优秀在线资源。您可以查看这些资源以更好地理解)
- 大多数编译器从右到左获取printf() 的每个参数。所以这里 A.length 先执行再执行 strleng(A)。所以即使你通过引用传递参数,它仍然会输出 6 1.
更新代码
#include <stdio.h>
#include <stdlib.h>
struct strstruct {
unsigned int length;
char string[20];
};
typedef struct strstruct stru;
int strleng(stru* A) {
int i = 0;
while(A->string[i] != '[=11=]'){
i++;
}
A->length = i;
return i;
}
int main() {
stru A = {1, {'a','b','c','d','e','f'}};
printf("%d %d %d\n", A.length, strleng(&A), A.length);//6 6 1
return 0;
}