Как заставить strcmp() работать в моей программе на C

Я собираюсь зашифровать текстовую строку, используя другую текстовую строку в качестве «ключа» для моего шифрования. По сути, это просто реорганизация символов ASCII.

Ключ дан и плохо структурирован, требует дополнительного программирования. Символы ASCII перечислены в этом ключе с одним символом для каждой строки и соответствующими зашифрованными символами через два индекса.

Это пример "key.txt":

A g
B 9
C ü
D (
E z

...продолжение для всех символов ASCII. Следовательно, шифрование в моей программе приведет к:

"EDABEDA" -> "z(g9z(g"

Когда я делаю шифрование.

  1. Я позволяю программе принимать входную строку и создаю другую строку с символами ключа шифрования.

  2. Я просматриваю каждый символ во входной строке с помощью for-sling. Для каждого символа во входной строке я проверяю, есть ли соответствующий символ в моей строке ключа шифрования. В ключе шифрования я перескакиваю на 4 шага за раз, так как собираюсь шифровать, и мне нужно только сравнить A, B, C, D...

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

  4. Предупреждения появляются в функции strcmp().

Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 3000

void encryption(char *input);

int main()
{
    char input[] = "EDABEDA";
    encryption(input);
}

void encryption(char *input)
{
    int length,i,k;
    size_t result;
    char dicc[1000];
    char output[SIZE];
    FILE *f;

    f = fopen("key.txt","r");

    fseek(f, 0, SEEK_END);
    length = ftell(f);
    fseek(f, 0, SEEK_SET);
    result = fread(dicc, 1, length, f);

    int lenDic = strlen(dicc);
    int lenInp = strlen(input);

    for (i = 0 ; i < lenInp ; i++)
    {
        for (k = 4 ; k < lenDic ; k = k + 4)
        {
            if (strcmp(input[i],dicc[k]) == 0)
            {
                output[i] = dicc[k+2];
                printf("%c",output[i]);
            }
        }
    }
    fclose(f);
}

Я получаю следующие предупреждения, и программа не работает. Любой, кто может помочь мне с этим предупреждением strcmp и знает, как мне изменить мою программу, чтобы она соответствовала ее требованиям?

warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [enabled by default]
if (strcmp(input[i],dicc[k]) == 0)
^
In file included from crypt.c:3:0:
/usr/include/string.h:144:12: note: expected ‘const char *’ but argument is of type ‘char’
 extern int strcmp (const char *__s1, const char *__s2)
            ^
warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast [enabled by default]
if (strcmp(input[i],dicc[k]) == 0)
^
In file included from crypt.c:3:0:
/usr/include/string.h:144:12: note: expected ‘const char *’ but argument is of type ‘char’
extern int strcmp (const char *__s1, const char *__s2)
           ^

person Carl    schedule 21.11.2015    source источник


Ответы (1)


Используйте strcmp() для сравнения строк, а не символов. Для вашего случая это

if (input[i] == dicc[k])

должно сработать.

Обратите внимание, что char — это просто целочисленный тип, а не строковый тип, в c нет строкового типа. И еще одно, пишите безопасный код! Проверка fopen() прошла успешно, и если length не превышает 999. Почти все, что можно считать ошибкой.

person Iharob Al Asimi    schedule 21.11.2015
comment
Бесконечно благодарен! И спасибо за советы по безопасному коду! - person Carl; 22.11.2015
comment
В шифровании я бы хотел, чтобы пробелы не переводились и чтобы они переводились как просто пробелы. Пробелы не включены в ключ. Когда я помещаю оператор else if под оператором if, заявляя: (input[i]= ), тогда output[i]= . И это дает мне ту же ошибку, что и раньше. Как реализовать такое условие? - person Carl; 22.11.2015