嘿伙计们,我的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;' (有'转子')“ 你能告诉我,我做错了吗? 谢谢!
答案 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