2017-07-11 2 views
0

Ich schreibe ein Programm in C, um die Verschiebung in einer Ceaser-Chiffre zu finden.c- Fehler beim Zuweisen des Strukturelements in der Funktion

Als Teil dieser ich zunächst alle möglichen Verschiebung, 0-26, auf die Nachricht zu entschlüsseln, verwende ich eine Struktur, um die Verschiebung und die Nachricht zu speichern. Dazu habe ich eine Funktion als Zeiger an eine Funktion übergeben. Wenn ich jedoch versuche, das Nachrichtenelement der Struktur in die entschlüsselte Nachricht zu ändern, erhalte ich den Fehler: ungültiges Typargument von '->' (have 'int') in der Zeile 'strcpy (s-> message, cipherText); ".

In der Funktion I zuweisen Sie auch eine lokale Variable zu einem Strukturelement und das funktioniert gut.

Code:

#include <stdio.h> 
#include <string.h> 
#define ENCRYPT 0 
#define DECRYPT 1 

struct Solution { 
    int key; 
    char message[]; 
}; 

void Ceaser(struct Solution *s, char cipherText[], int mode); 

void main(){ 
    struct Solution solutions[26]; 
    char cipherText[] = "lipps, asvph."; 

    for (int i = 0; i <= 26; ++i) { 
     solutions[i].key = i; 
     Ceaser(&solutions[i], cipherText, DECRYPT); 
     printf("Key: %d\tPlain text: %s\n", solutions[i].key, 
     solutions[i].message); 
    } 
} 

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);   
      } 
     } 
    //Error occurs below 
    strcpy(s->message, cipherText); 
    } 
} 
+1

's-> message':' char message []; 'hat keine Leerzeichen. – BLUEPIXY

+2

Das Problem ist, dass Sie zwei Variablen mit dem Namen s haben. Der innere Int s schattet die äußere Lösung * s. Wenn Sie gcc verwenden, ist das -Wshadow-Flag geschickt, um solche Probleme zu finden. –

+0

@BjornA. Danke, ich dachte, es wäre etwas Einfaches. Ich kann nicht glauben, dass ich den Konflikt nicht bemerkt habe. Danke auch für den Compiler-Tipp. – Henry

Antwort

0

Das Problem ist, dass Sie nicht die for(int s=... richtig schließen und der Compiler denkt, dass durch s-> Sie auf die Schleifenvariable beziehen s anstelle der Solution* s Funktionsparameter.

Deshalb erhalten Sie ungültigen Typ Fehler.

Das Folgende ist eine feste (und besser gegliederte) Version:

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

Wenn Sie die Compiler-Warnung lassen -Wshadow was Sie arbeitet bekommen sehr informativ ist.

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) { 
0
void Ceaser(struct Solution *s, char cipherText[], int mode){ 
.... 
for (int s = 0; s <= 26; ++s){ 

Können Sie nicht den offensichtlichen Konflikt hier sehen - Sie die gleichen Variablennamen zweimal verwenden. Die int s wird die vorherige Deklaration von s für den Bereich der for-Schleife überschreiben, so dass Ihr Code nicht mit der zuvor deklarierten interagieren kann.

Ändern Sie die erste s in einen richtigen Variablennamen (dh "Lösung"), so dass Sie den Konflikt vermeiden und auch offensichtlich ist, was der Zweck der Variablen ist. Variablen mit einem einzelnen Zeichen sind nicht sehr klar, wofür sie sind, selbst wenn sie nur für for-Schleifen verwendet werden.

Verwandte Themen