2016-05-01 4 views
0

Ich verstehe nicht, warum es nicht funktioniert. Es beschwert sich, wenn es 3 oder mehr Argumente gibt, aber nicht, wenn es nur den einen Vigenere arg gibt. Ich habe mir andere Leute angeschaut, die das gleiche Problem hatten und sie sagten, das habe funktioniert, um zu lösen ..... nicht sicher, was ich hier vermisse. Wenn ich ./vigenere ausführen, erhalte ich einen Segmentierungsfehler. Es funktioniert normalerweise mit 2 Arg wie ./vigenere bard und beschwert sich, wenn zusätzliche Argumente wie ./vigenere bard dfads gegeben werden.Vigenere cs50 nicht meckert, wenn fehlt zweiten arg

#include <cs50.h> 
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 




int main(int argc,string argv[]) 
{ 

string sKeyWord = argv[1];     
int iKeyLength = strlen(sKeyWord);   
int iKey[iKeyLength];       
string sPlainText = ""; 
int counter = 0; 
int iAccept = 0; 
do 
{ 
    if(argc != 2) // <-----this should work whats wrong? 
     { 
      printf("Invalid argument! Please enter program name and   keyword.\n"); 
      return 1; 
     } 
    else if(argv[1]) 
     { 
     for(int i = 0; i < iKeyLength; i++) 
      { 
       if (!isalpha(argv[1][i])) 
       { 
        printf("Invalid entry, please use letters only.\n"); 
        return 1; 
       } 
       else 
       { 
        iAccept = 1; 
       } 
      } 
     }  
}while(iAccept == 0); 


for(int i = 0; i < iKeyLength; i++)   
    { 
     iKey[i] = toupper(sKeyWord[i]) - 65;  
    } 

sPlainText = GetString();      
int iPlainText = strlen(sPlainText);   


for(int j = 0; j < iPlainText; j++) 
    { 
     if(!isalpha(sPlainText[j])) 
      { 
       printf("%c",sPlainText[j]); 
       counter++; 
      } 
     if(islower(sPlainText[j])) 
      { 
       printf("%c",((((sPlainText[j] - 97) + iKey[(j - counter)%iKeyLength])%26)+ 97)); 
      } 
     if(isupper(sPlainText[j])) 
      { 
       printf("%c",((((sPlainText[j] - 65) + iKey[(j - counter)%iKeyLength])%26)+ 65)); 
      } 

    } 
printf("\n"); 

return 0; 
} 
+2

sollten Sie früher untersuchen. ZB vor 'string sKeyWord = argv [1];' – BLUEPIXY

+0

DOH! danke bluepixy * High Five * mein Retter! geändert in Zeichenfolge skeyWord = ""; und dann am Ende der do while-Schleife argv [1] zugewiesen. – Firecore

+0

Warum überprüfen Sie die Argumente in einer Do-While-Schleife? (Hinweis: Ich denke, Sie brauchen diesen Code nicht in einer Schleife.) –

Antwort

0

Ich würde die obere, Argument Handhabung Abschnitt Ihres Programms wie folgt umschreiben.

int main(int argc, char **argv) 
{ 
    if (argc != 2) 
    { 
     fprintf(stderr, "Usage: %s key\n", argv[0]); 
     return 1; 
    } 
    char *sKeyWord = argv[1];     
    int iKeyLength = strlen(sKeyWord);   
    int iKey[iKeyLength];       

    for (int i = 0; i < iKeyLength; i++) 
    { 
     if (!isalpha(sKeyword[i])) 
     { 
      fprintf(stderr, "%s: Invalid character '%c' in key; please use letters only.\n", 
        argv[0], sKeyword[i]); 
      return 1; 
     } 
     iKey[i] = toupper(sKeyWord[i]) - 'A'; 
    } 

    …your code to read the text to be enciphered and encipher it, etc… 

Der entscheidende Punkt ist zu prüfen, ob es eine argv[1] ist, bevor Sie versuchen etwas damit zu tun. Ich habe eine do { … } while (…);-Schleife eliminiert, weil das Argument sich bei einer zweiten Iteration nicht ändert. Dadurch kann die iAccept Variable eliminiert werden. Beachten Sie, dass Fehler über den Standardfehler und nicht über die Standardausgabe gemeldet werden. Beachten Sie auch, dass den Nachrichten der Programmname vorangestellt ist (argv[0]). Eine "Usage" -Meldung ist oft die beste Möglichkeit, ein Problem zu melden. Es ist eine einfache Erinnerung an diejenigen, die das Programm ausführen, was erforderlich ist. Beachten Sie auch, dass die Fehlermeldung für die alphabetische Prüfung das fehlerhafte Zeichen meldet; das hilft den Leuten zu sehen, was das Programm für falsch hält.

Dies ist mehr oder weniger, was die Kommentare vorschlagen sollten getan werden.

Ich habe den Verschlüsselungscode nicht überprüft; da könnte es auch nicht diagnostizierte Probleme geben. Es gibt viele verwandte Fragen zu SO, die Ihnen jedoch Antworten auf solche Probleme liefern könnten.