[英]C Typedef Struct Problems
大家好,我的C代碼有兩個問題。 我創建了一個名為rotor的結構:
typedef struct rotor {
char characters[26];
int rotationPos;
} rotor;
我想創建該結構的實例,如下所示:
rotor r;
[error] r.characters[26]= {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
'Z'};
r.rotationPos = 5;
它給我以下錯誤:“-語法錯誤;-'{'之前的期望表達式”
我也有這個功能
void rotate(rotor r) {
char aux[26];
int i;
for (i = 0; i < 26; i++) {
if (i == 0) {
[error] aux[26] = r->characters[i];
} else
[error] aux[i] = r->characters[i + 1];
}
[error] r->characters=aux;
}
給出:“'->'(具有'rotor')的類型參數無效”你們能告訴我我在做什么錯嗎? 謝謝!
一旦創建了rotor
對象,就無法像這樣初始化數組,因為定義數組后無法分配給數組。 您必須執行以下操作:
rotor r = {{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
'Z'}, 5};
出於同樣的原因,這是:
r->characters=aux
函數的末尾永遠無法工作,因為您無法將一個數組分配給另一個數組。 您必須手動或使用諸如memcpy()
類的方式復制所有成員。
對於第二個問題,您將r
聲明為rotor
,而不是指向rotor
的指針,因此應使用.
運算符,而不是->
運算符,它用於指向struct
的指針。 或者,將函數更改為接受指針,然后將結構的地址傳遞給它(通常比傳遞副本或大型結構更好)。
由於rotor
是一個結構,因此將與字符數組一起創建。 它不是指向字符數組的指針,因此您不能將其指向其他對象。 您可以使用Paul提到的語法,也可以覆蓋當前數組。
char chars[26] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
rotor r;
memcpy(r.characters, chars, sizeof(chars));
同樣,當您調用rotate
方法時, rotor
將被復制到堆棧上。 您將執行實際的旋轉,但是返回時,執行旋轉的結構將丟失。 您應該改為傳遞一個指針。
void rotate(rotor *r);
使用&
運算符調用它。
rotate(&r);
在該方法中,您還將遇到無法替換陣列的問題。 我會將其留給您練習,但是如果您需要任何其他幫助,請回復。 (由於rotor
是此方法中的指針,因此您將需要使用->
訪問器語法。)
歡迎使用Stack Overflow!
1)您嘗試將初始化列表用於char ,您打算編寫
r.characters= {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
'Z'};
但這不是有效的C。
編輯:正如WhozCraig所指出的,更喜歡memcpy(我忘記了帶strcpy的空終止符)
char chars[26] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
rotor r;
memcpy(r.characters, chars, sizeof(chars));
要么
rotor r = {{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
'Z'}, 5};
2)在轉子對象(不是指針)上使用->運算符。 將其替換為“。”
void rotate(rotor r) {
char aux[26];
int i;
for (i = 0; i < 26; i++) {
if (i == 0) {
aux[26] = r.characters[i];
}
else
{
aux[i] = r.characters[i + 1];
}
}
memcpy(r.characters, aux, sizeof(aux));
}
您的旋轉方法可疑。 預期用途是什么? 編輯:確定
由於您已經在結構中設置了尺寸,因此無法像此處一樣進行分配。
另外,如果要正確讀取字符數組並避免讀取內存的其他字符,則應在字符數組的末尾添加“ \\ 0”
您可以聲明其大小的char數組:
char array[4] = {'1', '2', '3', '\0'};
如果您已經聲明過:
char array[4];
strcpy(array, "123\0");
您可以閱讀有關內存分配和C字符串函數的更多信息。
這篇文章還應該為您提供幫助: 將字符串分配給字符數組
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.