我是結構的新手。我正在嘗試撰寫一個具有結構的程式,并且該結構應該存盤一個字符陣列及其長度。我希望能夠更改長度的值,因為我將創建諸如修剪/連接陣列之類的函式。這是我寫的一段代碼:
#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]!='\0'){
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;
}
A.length盡管呼叫了 ,但 的值并沒有改變strleng。
(一)為什么?
(ii) 還有其他方法嗎?
uj5u.com熱心網友回復:
對于初學者,函式呼叫中引數的評估順序是未指定的。
所以在這個電話中
printf("%d %d\n",strleng(A),A.length);
引數運算式的評估A.length可以在呼叫函式之前進行,strleng反之亦然。
其次,函式strleng宣告為
int strleng(stru A);
處理A在 main 中宣告并用作引數的原始物件的副本。因此更改副本不會影響原始物件。
您需要通過指向它的指標通過參考傳遞物件。
unsigned int strleng( stru *A){
unsigned int i=0;
while(A->string[i]!='\0'){
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并且函式回傳型別也是int. 該函式應至少使用相同的型別unsigned int而不是 type int。
uj5u.com熱心網友回復:
試試下面的代碼:
#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]!='\0'){
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. 我現在應該得到答案了。
首先,如果要在函式內部修改結構的值,則需要使用指標作為引數。
對于您的問題:
- 對于大多數 c 編譯器,printf 函式內部的函式是從右到左處理的。我認為您的編譯器就是這個。
- 對于某些 c 編譯器,它會從左到右在一行中處理函式。
希望對你有幫助,c在線編譯器:https ://www.onlinegdb.com/online_c_compiler 。
uj5u.com熱心網友回復:
printf("%d %d\n",strleng(A),A.length);
- 首先,在這里您將引數作為值傳遞給 strleng 函式意味著 strleng 函式的引數是 A 的副本。換句話說,主函式中的變數 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] != '\0'){
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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/442972.html
上一篇:格式化結構中陣列中的字符
