C Typedef Struct问题

时间:2014-04-25 19:56:26

标签: c struct syntax-error typedef

嘿伙计们,我的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;

它给了我以下错误:“-Syntax erro; - '{'”之前的预期表达式

我也有这个功能

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

给出:“无效的类型参数' - &gt;' (有'转子')“ 你能告诉我,我做错了吗? 谢谢!

4 个答案:

答案 0 :(得分:4)

一旦创建了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的指针,因此您应该使用.运算符,而不是{{1} }}运算符,用于指向->的指针。或者,更改函数以接受指针,并将结构的地址传递给它(这通常比传递副本或大型结构更好)。

答案 1 :(得分:1)

由于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!

答案 2 :(得分:1)

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的null终结符)

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)使用正在使用 - &gt;转子对象上的操作符,它不是指针。将其替换为“。”

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

你的旋转方法很可疑。预期用途是什么? 编辑:好的

答案 3 :(得分:0)

由于您已在结构中设置了尺寸,因此无法像在此处那样进行分配。

另外,如果你想正确阅读它并避免阅读你内存中的其他字符,你应该在你的字符数组的末尾加一个'\ 0'

您可以声明一个大小为char的数组:

  char array[4] = {'1', '2', '3', '\0'};

如果您已经宣布:

   char array[4];
   strcpy(array, "123\0");

您可以阅读有关内存分配和C字符串函数的更多信息。

这篇文章也应该对你有所帮助: Assigning strings to arrays of characters