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

Программа Caesar Cipher C - формат %i ожидает аргумент типа int *, но имеет тип int

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


int main(int argc, const char *argv[])
{

argc++;

int number;

printf("Enter word you would like encoded\n");

scanf ("%s %i", argv[0], atoi(&argv[1]));

printf("%s", argv[1]);


int len = strlen(argv[1]);

for (int i = 0; i < len; i++)
{
    char offsetWord;

    offsetWord = atoi(argv[i])+len;

    putchar(offsetWord);
}

putchar('\n');

return 0;
}

Я пытаюсь создать программу шифрования C Caesar, которая компилируется из командной строки Linux. Требования:

1) ./ротн

abcdef

нет слов)

2) ./ротн собака

Gur dhvpx oebja sbk whzcf bire gur ynml qbt.

3) Запись в файл через "rotn".

./rotn собака лиса

$ кошка лиса

Gur dhvpx oebja sbk whzcf bire gur ynml qbt.

4) с использованием различных смен ./ротн -8 пса

Bpm ycqks jzwev nwf rcuxa wdmz bpm tihg lwo.

Это насколько я понял. Я запутался в ошибках компиляции. Тот, который у меня сейчас есть, это «формат предупреждения %i ожидает аргумент типа int *, но аргумент 3 имеет тип int.

Какие-либо предложения?


  • Ошибка возникает из-за того, что scanf со спецификатором %i хочет прочитать целое число из стандартного ввода и поместить значение в место, на которое вы указываете указатель. Целочисленный указатель имеет тип int *. Однако вы не scanf значения argv. Вы просто читаете их, и они представляют собой имя команды и аргументы командной строки. Они уже предоставлены вам из командной строки. Если вы хотите позже прочитать значения от пользователя, используйте свои собственные переменные, а не те, которые были переданы через main. 26.04.2016
  • Какова была цель argc++;, которую вы даже не используете (или не проверяете)? 26.04.2016

Ответы:


1

Как уже отмечалось в комментариях, вы перепутали несколько вещей:

  • argc и argv — это аргументы, которые передаются программе при ее вызове. Всегда есть хотя бы один аргумент, argv[0], имя программы. Вы должны использовать эту информацию для разбора вашей командной строки.

  • scanf сканирует форматированный ввод из stdin. Здесь вам не нужен форматированный ввод, вы можете прочитать целую строку с помощью fgets или вы можете прочитать один символ с помощью fgetc. Вы сохраняете отсканированные данные в новых переменных; не используйте повторно argv для этого.

Программа, интерпретирующая вашу командную строку, может выглядеть так:

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

int main(int argc, const char *argv[])
{
    int shift = 13;                 // default shift
    const char *infile = NULL;      // default is stdin
    const char *outfile = NULL;     // default is stdout
    int i = 1;

    if (i < argc && argv[i][0] == '-') {
        shift = atoi(&argv[i][1]);
        if (shift <= 0) {
            fprintf(stderr, "Illegal shift.\n");
            exit(1);
        }
        i++;
    }

    if (i < argc) {
        infile = argv[i];
        i++;
    }

    if (i < argc) {
        outfile = argv[i];
        i++;
    }

    if (i < argc) {
        fprintf(stderr, "Illegal extra argument.\n");
        exit(1);
    }

    printf("shift: %d\n", shift);
    if (infile) printf("infile: %s\n", infile);
    if (outfile) printf("outfile: %s\n", outfile);

    // now use this inforation in your program

    return 0;
}

Конечно, вы все равно должны реализовать сам кодировщик. Вот несколько советов:

  • stdin — допустимый дескриптор файла, поэтому вы можете использовать его, если пользователь не указал имя файла или дескриптор, возвращенный из fopen(infile, "r") в противном случае. Вы можете проверить, указал ли пользователь имя файла с помощью if (infile) ... Однако не забудьте закрыть файл, если это не stdin.

  • Та же логика может быть использована для выходного файла, за исключением того, что вы должны открыть файл в режиме записи "w" и использовать fprintf или fputc.

26.04.2016
Новые материалы

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

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

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

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

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

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

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