Nano Hash - криптовалюты, майнинг, программирование

Как перебирать каждую букву в строке?

#include <stdio.h>

int main()

#include <stdio.h>

int main()

{
    char msg[31] = {'\0'};
    char encrypted[31] = {'\0'};
    int key;


    printf("Please enter a message under 30 characters: ");
    fgets(msg, 31, stdin);

    printf("Please enter an encryption key: ");
    scanf("%d", &key);

    int i = 0;

    while (msg[i] && ('a' <= msg[i] <= 'z' || 'A' < msg[i] < 'Z'))
{
    encrypted[i] = (msg[i] + key);
    i++;
}

    printf("%s\n", msg);
    printf("%d\n", key);
    printf("%s\n", encrypted);

}

Хорошо, у меня есть код для увеличения символов, но я не знаю, как заставить его игнорировать специальные символы и пробелы. Также как мне использовать % для возврата к 'a' и 'A'?

Спасибо.

28.01.2013

  • Если ваш ключ int, что произойдет, если вы увеличите значение символа за пределы типа char? 29.01.2013
  • если человек вводит целое число, например 28, вместо того, чтобы пройти мимо «z», он вернется к «a» и добавит еще 2, чтобы добраться до «c». 29.01.2013
  • ASCII представляет собой больше, чем просто буквы — будьте осторожны! 29.01.2013
  • Вы используете шифр типа rot13? 29.01.2013
  • да, это шифр типа rot13 29.01.2013

Ответы:


1
  1. Вам просто нужен простой цикл for:

    for (int i = 0; i < 31; i++)
    {
        // operate on msg[i]
    }
    

    Если вы не знали длину строки с самого начала, вы можете предпочесть цикл while, который обнаруживает нулевой терминатор:

    int i = 0;
    while (msg[i])
    {
        // operate on msg[i]
        i++;
    }
    
  2. Ваши fgets и scanf, вероятно, в порядке, но лично я был бы последователен при чтении ввода и fgets для всего этого. Затем вы можете sscanf выйти key позже.

28.01.2013
  • Это тоже сработает. Я думаю, что это немного неидиоматично для новичка. 29.01.2013
  • Хорошо, я сделал это, и я получил его для увеличения. Но теперь есть другая проблема. Как мне сделать так, чтобы пробелы и специальные символы не увеличивались. Также, как мне заставить буквы возвращаться к «а». Я пробовал так: = (msg[i] + ключ); я++; } иначе { я++; 29.01.2013
  • Операторы сравнения так не складываются. Вам нужно if ((msg[i] >= 'a') && (msg[i] <= 'z')) и т.д. и т.п. 29.01.2013

  • 2

    scanf и fgets кажутся подходящими в этой ситуации, как вы их использовали.

    В C строка — это просто массив символов. Итак, вы получаете доступ к каждому элементу, используя цикл for и индексацию массива:

    for (int i = 0; i < strlen(str); i++) {
      char thisChar = str[i];
      //Do the processing for each character
    }
    

    Вы можете выполнять арифметические действия с thisChar по мере необходимости, но будьте осторожны, чтобы не превысить 255. Возможно, вы захотите установить флажок для key, чтобы убедиться, что оно не становится слишком большим.

    28.01.2013
  • Было бы лучше предварительно вычислить strlen, потому что, как я понимаю, strlen это O(n) РЕДАКТИРОВАТЬ: stackoverflow.com/questions/4132849/ 29.01.2013
  • Справедливый комментарий, хотя я не думаю, что скорость здесь является приоритетом - преждевременная оптимизация и все такое :) 29.01.2013
  • Достаточно верно. Код, вероятно, не будет медленным, но если это так, то причиной будет O(n^2)... впрочем, n ‹ 31, так что ничего страшного. 29.01.2013

  • 3

    Получение строки из scanf:

    char msg[31];
    scanf("%30s", msg);
    

    ИЛИ (менее эффективно, потому что сначала нужно заполнить массив нулями)

    char msg[31] = { 0 };
    scanf("%30c", msg);
    

    Итерация строки так же проста, как цикл for (обязательно используйте c99 или c11)

    int len = strlen(msg);
    for(int i = 0; i < len; i++) {
        char current = msg[i];
        //do something
        msg[i] = current;
    }
    

    «Шифрование» (т.е. шифрование) символа требует нескольких шагов

    1. Определите, есть ли у нас символ верхнего регистра, символ нижнего регистра или неалфавитный символ
    2. Определить позицию в алфавите, если он алфавитный.
    3. Обновите позицию, используя оператор модуля (%)
    4. Исправьте положение, если в алфавитном порядке

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

    Обратите внимание, что вы можете делать такие вещи, как:

    char c = 'C';
    char e = 'E' + 2; 
    char lower_c = 'C' - 'A' + 'a';
    
    28.01.2013
  • спасибо, у меня есть код для увеличения ключа, но теперь я застрял на использовании модуля для возврата к a или A, и я также не знаю, как заставить его не увеличивать специальные символы и пробелы. Я сделал это, и это все еще не работает. while (msg[i]) { if ('a' ‹= msg[i] ‹= 'z' || 'A' ‹ msg[i] ‹ 'Z') { зашифровано[i] = (msg[i] + ключ); я++; } иначе { я++; } } 29.01.2013
  • Попробуйте обрабатывать прописные буквы отдельно от строчных. Кроме того, 'a' <= msg[i] <= 'z' недопустимо, а 'a' <= msg[i] && 'z' >= msg[i] допустимо. Причина, по которой вам нужно обрабатывать верхний и нижний регистры отдельно, заключается в том, что верхний регистр имеет значение примерно на 30 больше, чем нижний регистр. 29.01.2013
  • @NeXtMaN_786 Кроме того, вам нужно получить символ от 0 до 25, добавить свой ключ, затем модуль, а затем вернуть его обратно к символу. Вот почему вы должны обрабатывать верхний и нижний регистр отдельно, потому что вы вычитаете разные числа, чтобы получить их от 0 до 25. 29.01.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..