Vigenere Cipher - Как игнорировать пробелы в простом тексте (на С)? - PullRequest
0 голосов
/ 17 февраля 2019

Жирным шрифтом я пытаюсь, чтобы программа игнорировала пробелы в виде обычного текста при выводе.Я запутался в том, как это сделать.Когда я запускаю программу, она не игнорирует пробелы.Вместо этого он запускается так, как если бы он был выделен жирным шрифтом, если оператор отсутствует.Я не понимаю, почему это так.Извините, если мой код немного грязный.Я только начал программировать.

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

int shift(char c);

int main(int argc, string argv[])
{
    // Check to see if two arguments are enterted at launch 
    int cipher = 0;
    if (argc != 2)
    {
        // If not return error & return 0
        printf("Usage: ./vigenere keyword \n");
        return 1;
    }
    else
    {
        int strlength = strlen(argv[1]);
        // Iterates through characters in second argument (key), checking to see 
        // if they are digits
        for (int k = 0; k < strlength; k++)
        {
            if (!isalpha(argv[1][k]))
            {
                // If not return error & return 1
                printf("Usage: ./vigenere keyword\n");
                return 2;
            }
        }
        //char *c =argv[1];
        string plaintext = get_string("Plaintext: ");
        int len = (int)strlen(plaintext);
        //int b = atoi(c);
        char code[len];
        strcpy(code, plaintext);
        for (int j = 0; j < len; j++)
        {
            int key = shift(argv[1][j]);

            if (isupper(argv[1][0]))
            {
                cipher = ((((code[j] - 'A') + key) % 26) + 'A');
                //printf("%c", (((plaintext[j] - 'A') + key) % 26) + 'A');
                //printf("%c",cipher);  
            }
            else if (islower(argv[1][0]))
            {
                cipher = ((((code[j] - 'a') + key) % 26) + 'a');
                //printf("%c", (((plaintext[j] - 'a') + key) % 26) + 'a');
                printf("%c",cipher);  
            }
            else if (!isalpha(code[j]))
            {
                code[j] = 0;
            }
            /* else
            {
                printf("%c", code[j] + (cipher));
            }
            */
        }
        printf("\n");
    }
}

int shift(char c)
{
    int i = c;
    if (i <= 'Z' && i >= 'A')
    {
        return ((i - 'A') % 26);
    }
    else
    {
        return ((i - 'a') % 26);
    }
}

1 Ответ

0 голосов
/ 17 февраля 2019

Хотя вы никогда не указывали, были ли комментарии достаточными для решения вашей проблемы, если вы все еще боретесь с тем, как получать данные с помощью функции CS50 get_string(), при этом не гарантируя, что они не содержат пробела , вы можетепросто напишите короткую оболочку для функции get_string().

В функции оболочки вы можете просто передать любую подсказку непосредственно в get_string(), сохранив возврат.Затем выделите вторую строку для хранения содержимого и зациклите строку, возвращенную get_string(), копируя только непробельные символы в новый блок памяти, обнуляя новую строку после завершения и возвращая новую строку.

Это может быть что-то простое:

#include <cs50.h>
...
/* function using CS50 get_string() to fill input w/o spaces */
string get_str_nospc (string p)
{
    size_t ndx = 0;             /* index */
    string s = get_string (p),  /* string returned by get_string() */
        sp = s,                 /* pointer to s (must preserve s address) */
        s_nospc = NULL;         /* pointer to copy with no whitespace */

    if (!s)     /* validate get_string() return */
        return NULL;

    /* allocate/validate storage for string without whitespace */
    if (!(s_nospc = malloc (strlen (s) + 1))) {
        perror ("malloc-s_nospc");
        return NULL;
    }

    do  /* copy s to s_nospc omitting whitespace */
        if (!isspace (*sp))         /* if it's not a space - copy */
            s_nospc[ndx++] = *sp;
    while (*sp++);  /* post-increment ensures nul-character copied */

    return s_nospc; /* return string with no whitespace */
}

( примечание: вы хотите выделить и скопировать независимо от того, содержит ли строка, возвращаемая get_string(), пробел в качестве строкивозвращаемый get_string() освобождается деструктором библиотеки CS50 при выходе. Ваша функция не должна возвращать строку, которая может / может не нуждаться в освобождении на основании условия внутри функции - вы никогда не узнаете, были ли вы ответственны за вызовfree или нет.)

Коротким примером может быть:

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

#include <cs50.h>

/* function using CS50 get_string() to fill input w/o spaces */
string get_str_nospc (string p)
{
    size_t ndx = 0;             /* index */
    string s = get_string (p),  /* string returned by get_string() */
        sp = s,                 /* pointer to s (must preserve s address) */
        s_nospc = NULL;         /* pointer to copy with no whitespace */

    if (!s)     /* validate get_string() return */
        return NULL;

    /* allocate/validate storage for srting without whitespace */
    if (!(s_nospc = malloc (strlen (s) + 1))) {
        perror ("malloc-s_nospc");
        return NULL;
    }

    do  /* copy s to s_nospc omitting whitespace */
        if (!isspace (*sp))         /* if it's not a space - copy */
            s_nospc[ndx++] = *sp;
    while (*sp++);  /* post-increment ensures nul-character copied */

    return s_nospc; /* return string with no whitespace */
}

int main (void) {

    string nospc = get_str_nospc ("input : ");

    if (nospc) {
        printf ("nospc : %s\n", nospc);
        free (nospc);
    }
}

Пример использования / Вывод

$ ./bin/cs50_getstrnospc
input : my dog has fleas
nospc : mydoghasfleas

Посмотрите на вещии дайте мне знать, если это ваш последний комментарий.Если нет, я с радостью помогу вам.

...