Имеются ли в C символы с заранее заданными нулевыми индексированными значениями? - PullRequest
0 голосов
/ 20 февраля 2019

Извините, если мой заголовок немного вводит в заблуждение, я все еще плохо знаком с этим, но:

Я недавно работал над небольшим проектом шифрования, где пользователь может дать файлу аргумент в командной строке.но это должно быть в алфавитном порядке.(Пример: ./file abc)

Этот аргумент будет затем использоваться в формуле для шифрования сообщения с открытым текстом, который вы предоставляете.Я получил код на работу, спасибо моему другу за помощь, но я не на 100% определенная часть этой формулы.

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


int main (int argc, string argv[])
{   //Clarify that the argument count is not larger than 2
    if (argc != 2)
    {
        printf("Please Submit a Valid Argument.\n");
        return 1;
    }
    //Store the given arguemnt (our key) inside a string var 'k' and check if it is alpha
    string k = (argv[1]);
    //Store how long the key is
    int kLen = strlen(k);
    //Tell the user we are checking their key
    printf("Checking key validation...\n");
    //Pause the program for 2 seconds
    sleep(2);
    //Check to make sure the key submitted is alphabetical
    for (int h = 0, strlk = strlen(k); h < strlk; h++)
    {
        if isalpha(k[h])
        {
            printf("Character %c is valid\n", k[h]);
            sleep(1);
        }
        else
        {   //Telling the user the key is invalid and returning them to the console
            printf("Key is not alphabetical, please try again!\n");
            return 0;
        }

    }
    //Store the users soon to be enciphered text in a string var 'pt'
    string pt = get_string("Please enter the text to be enciphered: ");
    //A prompt that the encrypted text will display on
    printf("Printing encrypted text: ");
    sleep(2);
    //Encipher Function
    for(int i = 0, j = 0, strl = strlen(pt); i < strl; i++)
    {
        //Get the letter 'key'
        int lk = tolower(k[j % kLen]) - 'a';
        //If the char is uppercase, run the V formula and increment j by 1
        if isupper(pt[i])
        {
            printf("%c", 'A' + (pt[i] - 'A' + lk) % 26);
            j++;
        }
        //If the char is lowercase, run the V formula and increment j by 1
        else if islower(pt[i])
        {
            printf("%c", 'a' + (pt[i] - 'a' + lk) % 26);
            j++;
        }
        //If the char is a symbol just print said symbol
        else
        {
            printf("%c", pt[i]);
        }
    }
    printf("\n");
    printf("Closing Script...\n");
    return 0;
}

Функция шифра: использует символ "A" в качестве символа для заполнителяно «А» автоматически содержит нулевое индексированное значение?(B = 1, C = 2, ...)

Ответы [ 4 ]

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

char - это числовой тип, который также часто используется для представления видимых символов (или специальных невидимых псевдосимволов).'A' - это значение (с фактическим типом int), которое можно преобразовать в char без переполнения или переполнения.То есть это действительно какое-то число, но вам обычно не нужно знать, какое число, поскольку вы обычно используете конкретное значение char либо просто как число, либо как просто символ, а не оба.

Но эта программа использует char значения в обоих направлениях, поэтому в некоторой степени имеет значение, какие числовые значения соответствуют видимым символам.Один из способов сделать это очень часто, но не всегда , это использовать значения ASCII , которые пронумерованы от 0 до 127, или какую-то другую схему, которая использует эти значения плюс дополнительные значениявне этого диапазона.Так, например, если компьютер использует одну из этих схем, то 'A'==65 и 'A'+1==66, то есть 'B'.

Эта программа предполагает, что все строчные буквы латинского алфавита имеют числовые значенияв последовательном порядке от 'a' до 'z', и все заглавные буквы латинского алфавита имеют числовые значения в последовательном порядке от 'A' до 'Z', не обращая внимания на то, что именно эти значения.Это верно для ASCII, поэтому он будет работать на многих типах машин.Но нет никакой гарантии, что это всегда будет верно!

C гарантирует, что десятизначные символы от '0' до '9' расположены в последовательном порядке, что означает, что если n - это цифра от нуля додевять включительно, тогда n + '0' - это символ для отображения этой цифры, а если c - это такой символ, то c - '0' - это число от нуля до девяти, которое оно представляет.Но это единственная гарантия, которую язык C дает в отношении значений символов.

Один контрпример приведен в EBCDIC , который сейчас не так широко используется, но использовался в некоторых старыхкомпьютеры, и C поддерживает это.Его буквенные символы расположены в виде последовательности последовательных букв, но не со всеми 26 буквами каждого случая все вместе.Таким образом, программа выдаст неверные результаты при работе на таком компьютере.

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

автоматически ли 'A' содержит нулевое индексированное значение?(B = 1, C = 2, ...)

Нет.Строго соответствующий код C не может зависеть от какой-либо кодировки символов, кроме цифр 0 - 9, представляемых последовательно, даже если общий набор символов ASCII действительно представляет их последовательно.

Единственная гарантия в отношении наборов символов - на 5.2.1 Наборы символов , абзац 3 стандарта C :

... значение каждого символапосле 0 в приведенном выше списке десятичных цифр должен быть на единицу больше, чем значение предыдущего ...

Наборы символов, такие как EBCDIC , не представляют буквы последовательно

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

Последовательность - это только один аспект, вызывающий озабоченность.

Правильное использование isalpha(ch) - это еще один, не совсем правильно реализованный в коде OP.

isalpha(ch) ожидает ch вдиапазон unsigned char или EOFk[h], char, это значение может быть отрицательным.Обеспечьте неотрицательное значение с помощью:

// if  isalpha(k[h])
if isalpha((unsigned char) k[h])
0 голосов
/ 20 февраля 2019

В C символьные литералы, такие как 'A', имеют тип int и представляют любое целочисленное значение, кодирующее символ A в вашей системе.На 99,999% систем, использующих кодировку символов ASCII, это число 65. Если у вас старый мэйнфрейм IBM 1970-х годов, использующий EBCDIC, это может быть что-то другое.Вы заметите, что код вычитает 'A' для получения значений на основе 0.

Это предполагает, что буквы AZ занимают 26 последовательных кодов.Это верно для ASCII (A = 65, B = 66 и т. Д.), Но не для всех кодов и не гарантируется языком.

...