更改结构中元素的值

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;
}

尽管调用了 strlengA.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);
  1. 首先,在这里你将参数作为值传递给strleng函数意味着strleng函数的参数是A的copy。换句话说,主变量A strleng函数内部的函数和结构体变量是两个自变量。因此,在 strleng 函数中更改 A.length 对主函数中的变量 A 不可见。 (有很多关于按值传递与按引用传递的优秀在线资源。您可以查看这些资源以更好地理解)
  2. 大多数编译器从右到左获取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;
}