c-在函数中分配结构成员时出错

时间:2017-07-11 16:20:58

标签: c function pointers struct member

我正在用C编写一个程序来查找ceaser密码的转换。

作为其中的一部分,我首先对要解密的消息执行每个可能的移位0-26,我使用结构来存储移位和消息。为此,我将结构作为指针传递给函数。但是,当我尝试将结构的消息成员更改为已解密的消息时,我收到错误:' - >'的无效类型参数('int')行'strcpy(s-> message,cipherText);'。

在函数中我还将一个局部变量赋给一个结构成员,这很好。

代码:

submitButton.addActionListener(new StatusUpdateListener(userTextField, statusLabel));

2 个答案:

答案 0 :(得分:0)

问题是你没有正确关闭for(int s=...并且编译器认为s->你指的是循环变量s而不是Solution* s函数参数。

这就是为什么你得到无效类型错误。

以下是固定(并且更好的缩进)版本:

void Ceaser(struct Solution *s, char cipherText[], int mode) {
  int len = strlen(cipherText);
  int c;
  int key = s->key;

  for (int s = 0; s <= 26; ++s) {
    if (mode == DECRYPT) {
      key *= -1;
    }

    for (int i = 0; i < len; ++i) {
      c = cipherText[i];

      if (c >= 'A' && c <= 'Z') {
        cipherText[i] = 'A' + ((c + key - 'A') % 26);
      } else if (c >= 'a' && c <= 'z') {
        cipherText[i] = 'a' + ((c + key - 'a') % 26);
      }
    }
  } //<--------was missing 

  strcpy(s->message, cipherText);
}

如果您让编译器警告-Wshadow有效,那么您将获得非常丰富的信息。

g++
test.cpp:65:30: note: shadowed declaration is here
 void Ceaser(struct Solution *s, char cipherText[], int mode) {

clang++
note: previous declaration is here
void Ceaser(struct Solution *s, char cipherText[], int mode) {


icpc
warning #1599: declaration hides parameter "s" (declared at line 65)
    for (int s = 0; s <= 26; ++s) {

答案 1 :(得分:0)

void Ceaser(struct Solution *s, char cipherText[], int mode){
....
for (int s = 0; s <= 26; ++s){

你能否在这里看到明显的冲突 - 你使用相同的变量名两次。对于for循环的范围,int s将覆盖先前的s声明,因此您的代码将无法与之前声明的代码进行交互。

将第一个s更改为适当的变量名称(即“解决方案”),以便避免冲突,并且显而易见的是变量的用途。单个字符变量不是很清楚它们的用途,即使它们只是用于for循环。