Как правильно преобразовать строку массива «цифр», используя шифр букв? - PullRequest
1 голос
/ 02 февраля 2020

Я доберусь до сути. Я знаю, что это должно быть просто, но это дает мне обходной путь. Я работаю в безопасной локальной сети. Мне нужно взять вход (в моем случае, IP-адрес) и зашифровать этот адрес, прежде чем безопасно хранить его в базе данных.

Я бы хотел зашифровать его в формате письма. Трудно объяснить, но если вы посмотрите этот код, вы увидите, что я пытаюсь выполнить sh. Я отформатировал его, чтобы принять ввод от вас, пользователя, тогда как эта функция будет вызываться в режиме реального времени в фоновом режиме, когда она работает должным образом.

В идеале, пользователь будет вводить 12.23.34.45

Функция выдаст KS.SL.LE.EI

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

#define MAXLEN 16

void cwitch(char *instr[MAXLEN]){
    char *nstr = "0123456789";
    char *cstr = "DKSLEIANQP";

    int count = strlen(instr);
    char *output[count];

    int i;
    for(i = 0; i < count; i++){
        if(instr[i] != '\0'){
            int t;
            for(t = 0; t < count; t++){
                if(instr[i] == "."){ /*Do Nothing, Straight Logic - I Know This Is Useless*/ }
                else if(instr[i] == nstr[t]) output[i] = cstr[t];
            }
        }
    }
    output[count] = 0; //Null Terminate The String
    printf("Output: %s\n", output);
}

int main(void){
    char *input[500];
    printf("Enter Address: ");
    fgets(input, sizeof(input), stdin);
    input[strlen(input) - 1] = 0; //Remove \newline Character

    cwitch(input);
    return 0;
}

Однако после выполнения я явно не получаю желаемых результатов, иначе меня бы здесь не было!

[root@RyM ~]# ./test
Enter Address: 12.23.34.45
Output:
         `
[root@RyM ~]# ./test
Enter Address: 167.174.12.178
Output:
[root@RyM ~]# ./test
Enter Address: 45.223.6.1
Output:
         `
[root@RyM ~]# ./test
Enter Address: 918.6.56.222
Output:
[root@RyM ~]#

Любая помощь / совет приветствуется. Я новичок в C. Ожидайте предупреждения при компиляции. Не стесняйтесь поджарить / посоветовать мне, что касается упомянутых предупреждений существования. Изменить: Предупреждения включены ниже

[root@RyM ~]# gcc -o test Test.c
Test.c: In function ‘cwitch’:
Test.c:10: warning: passing argument 1 of ‘strlen’ from incompatible pointer type
/usr/include/string.h:399: note: expected ‘const char *’ but argument is of type ‘char **’
Test.c:19: warning: comparison between pointer and integer
Test.c:19: warning: assignment makes pointer from integer without a cast
Test.c: In function ‘main’:
Test.c:31: warning: passing argument 1 of ‘fgets’ from incompatible pointer type
/usr/include/stdio.h:626: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
Test.c:32: warning: passing argument 1 of ‘strlen’ from incompatible pointer type
/usr/include/string.h:399: note: expected ‘const char *’ but argument is of type ‘char **’```

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

В этой строке

void cwitch(char *instr[MAXLEN])

вы говорите, что cwitch принимает массив символов (длиной MAXLEN). Это должно быть просто char *instr. Аналогично, в этой строке

char *output[count];

вы объявляете массив из char *, в то время как вы намерены сделать его массивом char: char output[count]. Наконец, вы не можете сравнить символ 'x' с строкой

if (instr[i] == ".")

- это снова должен быть символьный литерал ('.').

A small logi c проблема: если входной символ ., вы не должны «ничего не делать», вы должны также скопировать его в выходную строку.

С этими исправлениями ваша программа действительно работает.

0 голосов
/ 02 февраля 2020

Основная проблема в вашем коде - неправильное определение массива char (или константной строки). Правильное определение:

char output[count]; // where count is compile time constant

и NOT char *output[count];

[] сообщает компилятору, что это массив (тип указателя) ).

Таким образом, нет необходимости использовать *, если вы не хотите определять массив указателей (что не соответствует вашему случаю).

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

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

#define MAXLEN 16

void cwitch(const char* instr) {
    const char* nstr = "0123456789";
    const char* cstr = "DKSLEIANQK";

    int count = strlen(instr);
    char output[MAXLEN];

    int i;
    for (i = 0; i < count; i++) {
        if (instr[i] != '\0') {
            int t;
            for (t = 0; t < count; t++) {
                if (instr[i] == '.') {
                    output[i] = '.';
                }
                else if (instr[i] == nstr[t]) output[i] = cstr[t];
            }
        }
    }
    output[count] = 0; //Null Terminate The String
    printf("Output: %s\n", output);
}

int main(void) {
    char input[500];
    printf("Enter Address: ");
    fgets(input, sizeof(input), stdin);
    input[strlen(input) - 1] = 0; //Remove \newline Character

    cwitch(input);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...