簡體   English   中英

C Typedef結構問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM