2016-07-29 15 views
-3

Ich versuche, Wort zu verschleiern, die in Zeichenfolge gespeichert ist und mein Code funktioniert manchmal und manchmal nicht. Hier ist mein Code:Strange char erscheint in der Ausgabe

// main function 
int main(int argc, string argv[]) 
{ 
    string k, plaintext; 
    int size, i = 0, key = 0; 
    k = argv[1]; 
    size = strlen(k); 
    if (argc < 2 || !isNummeric(k, size) || k < 0) 
     return 1; 
    else 
    plaintext = GetString(); 
    size = strlen(plaintext); 
    char ciphertext[size]; 
    key = atoi(k); 
    while(i < size) 
    { 
     if (isalpha(plaintext[i])) 
     { 
      encipher(key, i, &ciphertext[i], plaintext); 
     } 
     else 
     { 
      ciphertext[i] = plaintext[i]; 
     } 
     i++; 
    } 
    printf("%s\n",ciphertext); 
} 

Ein Schlüssel vom Benutzer empfangen wird jeden Buchstaben zu verschieben, und ich brauche, um zu überprüfen, ob der Schlüssel numerischer Wert ist oder nicht, so habe ich isNummeric Funktion zu tun, dass

bool isNummeric(string k, int size) 
{ 
    int c=0; 
    for(int i=0; i<size; i++) 
    { 
     if(!isdigit(k[i])) 
     c++; 
    } 
    if(c==0) 
    return true; 
    return false; 
} 

Nun chiffrieren ich Funktion gemacht jeden Buchstaben zu verschieben:

void encipher(int k, int i, char *pt, string plaintext) 
{ 
    int p, c; 
    if(islower(plaintext[i])) 
    { 
     p=plaintext[i]-'a'; 
     c=(p+k)%26; 
     *pt=c+97; 
    } 
    else 
    { 
     p=plaintext[i]-'A'; 
     c=(p+k)%26; 
     *pt=c+65; 
    } 
} 

here is my output

+5

Erste Beobachtung, Sie verweisen auf "argv [1]", bevor Sie "argc" überprüfen. Was ist "Schnur"? Zeigen Sie das [Minimale, vollständige und überprüfbare Beispiel] (http://stackoverflow.com/help/mcve) an, das zeigt, was Sie versucht haben. –

+1

'char ciphertext [size];' ist einer zu kurz und ist nicht abgeschlossen. Ändern Sie es in 'Char ciphertext [Größe + 1] = {0};' sollte helfen. –

+0

Angenommen, der geheime Schlüssel, k, ist 13 und der Klartext, p, lautet "Achten Sie darauf, Ihren Ovaltine zu trinken!" Lassen Sie uns das p mit dem k verschlüsseln, um den Chiffretext c zu erhalten, indem Sie jeden Buchstaben in p um 13 Stellen drehen, wobei: Achten Sie darauf, Ihren Ovaltine zu trinken! wird: Oder fher gb qevax lbhe Binygvar! aber einige Male druckt es so etwas wie in dem Bild ich hochgeladen –

Antwort

0

mehrere Kommentare von der Frage, in festgelegten Code-Montage ergibt den folgenden Code, die zu funktionieren scheint:

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

static bool isNumeric(string k, int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     if (!isdigit((unsigned char)k[i])) 
      return false; 
    } 
    return true; 
} 

/* There are too many arguments to this function - but it works */ 
static void encipher(int k, int i, char *pt, string plaintext) 
{ 
    int p, c; 
    if (islower((unsigned char)plaintext[i])) 
    { 
     p = plaintext[i] - 'a'; 
     c = (p + k) % 26; 
     *pt = c + 'a'; 
    } 
    else 
    { 
     p = plaintext[i] - 'A'; 
     c = (p + k) % 26; 
     *pt = c + 'A'; 
    } 
} 

int main(int argc, string argv[]) 
{ 
    string k = argv[1]; 
    if (argc < 2 || !isNumeric(k, strlen(k))) 
     return 1; 
    string plaintext = GetString(); 
    int size = strlen(plaintext); 
    char ciphertext[size + 1]; 
    int key = atoi(k); 
    for (int i = 0; i < size; i++) 
    { 
     if (isalpha(plaintext[i])) 
     { 
      encipher(key, i, &ciphertext[i], plaintext); 
     } 
     else 
     { 
      ciphertext[i] = plaintext[i]; 
     } 
    } 
    ciphertext[size] = '\0'; 
    printf("%s\n", ciphertext); 
} 

Das Programm hieß csr13 und gibt folgende Ausgänge:

$ csr13 4 
The Quick Brown Fox Jumped Over The Lazy Dog 
Xli Uymgo Fvsar Jsb Nyqtih Sziv Xli Pedc Hsk 
$ csr13 22 
Xli Uymgo Fvsar Jsb Nyqtih Sziv Xli Pedc Hsk 
The Quick Brown Fox Jumped Over The Lazy Dog 
$ 

Ein besseres Design für Die encipher Funktion würde das einzelne Zeichen plus den "Schlüssel" Offset übergeben und würde das verschlüsselte Zeichen zurückgeben:

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

static bool isNumeric(string k, int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     if (!isdigit((unsigned char)k[i])) 
      return false; 
    } 
    return true; 
} 

static int encipher(int k, int c) 
{ 
    assert(isalpha(c)); 
    if (islower(c)) 
     return (c - 'a' + k) % 26 + 'a'; 
    else 
     return (c - 'A' + k) % 26 + 'A'; 
} 

int main(int argc, string argv[]) 
{ 
    string k = argv[1]; 
    if (argc < 2 || !isNumeric(k, strlen(k))) 
     return 1; 
    string plaintext = GetString(); 
    int size = strlen(plaintext); 
    char ciphertext[size + 1]; 
    int key = atoi(k); 
    for (int i = 0; i < size; i++) 
    { 
     if (isalpha(plaintext[i])) 
      ciphertext[i] = encipher(key, plaintext[i]); 
     else 
      ciphertext[i] = plaintext[i]; 
    } 
    ciphertext[size] = '\0'; 
    printf("%s\n", ciphertext); 
}