Я пытаюсь распечатать массив символов, но он не печатает первую букву

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

void encryptmessage1(char[][6]);
void encryptmessage2(char[][6]);
int
main()
{
    char array[5][6] = {
        {'A', 'B', 'C', 'D', 'E'},
        {'F', 'G', 'H', 'I', 'J'},
        {'K', 'L', 'M', 'N', 'O'},
        {'P', 'Q', 'Z', 'R', 'S', 'T'},
        {'U', 'V', 'W', 'X', 'Y'}
    };
    int choice;

    printf("********************************\n");
    printf("**ENCRYPTION/DECRYPTION SYSTEM**\n");
    printf("********************************\n");
    printf("\n");
    printf("1.Code the message\n");
    printf("2.Decode the message\n");
    printf("3.EXIT\n");
    printf("Make your choice: ");
    scanf("%d", &choice);

    switch (choice) {
    case 1:
        encryptmessage1(array);
        encryptmessage2(array);
        break;

    case 2:
        // decrypt message
        break;

    default:
        break;
    }

    return 0;
}

void
encryptmessage1(char array[][6])
{
    int i, j, loop, k = 0, row, col, len = 0;
    char str[80] = {};
    char temparr[80] = {};                   // temporary array
    char temp;

    printf("Please enter your message : ");
    temp = getchar();

    // reads string
    while ((str[k] = getchar()) != '\n') {
        k++;
    }
    i = 0;

    // loop to temporary store values from another array
    for (loop = 0; loop < 80; loop++) {
        temparr[loop] = str[loop];
    }

    // Calculating length of the array
    len = sizeof(str) / sizeof(str[0]);
    // Checks for space character in array if its there then ignores it
    // and swap str[i] to str[i+1];
    for (i = 0; i < len; i++) {
        if (str[i] == ' ') {
            for (j = i; j < len; j++) {
                str[j] = str[j + 1];
            }
            len--;
        }
    }

    i = 0;
    // from lowercase to uppercase
    while (str[i] != '\n') {
        if (islower(str[i])) {
            str[i] = toupper(str[i]);
        }
        i++;

    }
    puts(str);

    i = 0;
    k = 0;
    while (str[k] != '\n') {
        for (row = 0; row < 5; row++) {
            for (col = 0; col < 6; col++) {
                if (str[k] == array[row][col]) {

                    temparr[i] = '0' + row;
                    temparr[i + 1] = '0' + col;
                    i += 2;
                }

            }
        }
        k++;
    }
   puts(temparr);
   }


void
encryptmessage2(char array[][6])
{ int i, j, loop, k =0, row, col;
    char key[80] = {};
    char temparr2[80] = {};                   // temporary array
    char temp;

    printf("Please enter your key : ");
    temp = getchar();

// reads string
    while ((key[k] = getchar()) != '\n') {
        k++;
    }
    i = 0;

// loop to temporary store values from another array
    for (loop = 0; loop < 80; loop++) {
        temparr2[loop] = key[loop];
    }

// array from lowercase to uppercase
    while (key[i] != '\n') {
        if (islower(key[i])) {
            key[i] = toupper(key[i]);
        }
        i++;

    }

//Printing the array with spaces using pointer
char *ptr = key;
if (*ptr) {
    putchar(*ptr++);
    while (*ptr) {
        putchar(' ');
        putchar(*ptr++);
    }
}

}

[outputoftheproblem](https://i.stack.imgur.com/wLUGa.png)

Если я ввожу ключевое слово cortina, он просто печатает ortina без первой буквы Я не знаю, проблема в указателе Также любые идеи, как я могу распечатать тот же набор чисел, которые были зашифрованы из str [] в виде массива под словом «CORTINA», как в примере выше:

C O R T I N A
1 1 0 0 3 4 0
3 4 5 6 3 2 5
2 3 4 5 6 7 8 
2 3 4 3 2 4 5

Первый символ помещается в temp с temp = getchar();. Вы никогда не используете это, для чего это?

Barmar 19.11.2022 00:34

это единственный способ, которым я могу прочитать массив по какой-то причине, если я попытаюсь ввести str[]=getchar(), он не будет работать или без getchar он не позволит пользователю ввести сообщение

XIz 19.11.2022 00:41

Вы пытаетесь пропустить новую строку, оставшуюся во входном потоке после scanf()?

Barmar 19.11.2022 00:43

проблема в том, что вы вызываете encryptmessage1() после scanf(), поэтому вам нужно пропустить новую строку. Но encryptmessage2() вызывается после encryptmessage1(), что не покидает символ новой строки.

Barmar 19.11.2022 00:45

Я предлагаю вам изменить весь ваш код, чтобы использовать fgets() для чтения строки ввода везде. Затем вы можете использовать sscanf(), чтобы извлечь параметр в основном коде и перебрать его в коде шифрования. Такое смешивание scanf() и getchar() чревато ошибками.

Barmar 19.11.2022 00:46

@Barmar Я удалил getchar() из кода и заменил его на fgets(), он позволяет мне вводить символы, но проблема с печатью ключевого слова без его первого символа все еще существует.

XIz 19.11.2022 01:03

Вам нужно добавить пробел после %d в main(), чтобы он очищал новую строку от вашего выбора меню. Или используйте fgets там тоже.

Allan Wind 19.11.2022 01:05

Вы также должны использовать fgets() в main(). В противном случае fgets() будет читать пустую строку после числа. См. stackoverflow.com/questions/5918079/…

Barmar 19.11.2022 01:06
str[j] = str[j + 1] выходит за рамки.
Allan Wind 19.11.2022 01:06
char temparr[80] = {} не является стандартным c, либо используйте { 0 }, либо просто оставьте его неинициализированным.
Allan Wind 19.11.2022 01:15

@Barmar не использует fgets() для строки или текстовой строки, как я смогу изменить scanf в main(), когда «опция» является целым числом

XIz 19.11.2022 01:28

Да. Вы меняете вот так char choice[3]; а потом if (*choice == '1')

Allan Wind 19.11.2022 01:29

Вы используете fgets(stdin, buffer, sizeof buffer), чтобы прочитать строку, затем sscanf(buffer, "%d", &choice), чтобы получить выбор. Или choice = atoi(buffer);

Barmar 19.11.2022 02:50
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
13
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исправил отсутствующий первый символ и доступ за пределы границ. Рефакторинг кода уменьшает дублирование и минимизирует область действия переменных.

Ключ печатается в соответствии с запросом, но неясно, как вы хотите выровнять ключ и зашифрованный текст. Вы печатаете ciphertext до того, как будет прочитано key, и вы не используете key ни для чего в своем коде. Я предполагаю, что вы хотите перепутать array с помощью key.

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

#define STR_LEN 80

void encode(const char array[][6], const char *plaintext, char *ciphertext);
void encrypt(const char array[][6]);
int lookup(const char array[][6], char c, size_t *row, size_t *col);
void strip(char *str);
void upcase(char *str);

void encode(const char array[][6], const char *plaintext, char *ciphertext) {
    size_t i = 0;
    for(; plaintext[i]; i++) {
        size_t row;
        size_t col;
        if(lookup(array, plaintext[i], &row, &col)) {
            ciphertext[2 * i] = '0' + row;
            ciphertext[2 * i + 1] = '0' + col;
        } else {
            ciphertext[2 * i] = ' ';
            ciphertext[2 * i + 1] = ' ';
        }
    }
    ciphertext[2*i] = '\0';
    puts(ciphertext);
}

void encrypt(const char array[][6]) {
    printf("Please enter your message : ");
    char plaintext[STR_LEN];
    fgets(plaintext, sizeof plaintext, stdin);
    plaintext[strcspn(plaintext, "\n")] = '\0';

    strip(plaintext);
    upcase(plaintext);
    puts(plaintext);
    char ciphertext[2 * STR_LEN - 1];
    encode(array, plaintext, ciphertext);

    printf("Please enter your key : ");
    char key[STR_LEN];
    fgets(key, sizeof key, stdin);
    key[strcspn(key, "\n")] = '\0';
    upcase(key);

    for(size_t i = 0; key[i]; i++) {
        putchar(key[i]);
        putchar(' ');
    }
    putchar('\n');
}

int lookup(const char array[][6], char c, size_t *row, size_t *col) {
    for(*row = 0; *row < 5; (*row)++)
        for(*col = 0; *col < 6; (*col)++)
            if(c == array[*row][*col])
                return 1;
    return 0;
}

void strip(char *str) {
    size_t i = 0;
    for(size_t j = 0; str[j];) {
        if(str[j] == ' ')
            j++;
        else
            str[i++] = str[j++];
    }
    str[i] = '\0';
}

void upcase(char *str) {
    while(*str) {
        *str = toupper(*str);
        str++;
    }
}

int main(void ) {
    printf(
        "********************************\n"
        "**ENCRYPTION/DECRYPTION SYSTEM**\n"
        "********************************\n"
        "1. Code the message\n"
        "2. Decode the message\n"
        "3. EXIT\n"
        "Make your choice: "
    );
    char choice[3];
    fgets(choice, 3, stdin);
    if(*choice == '1') {
        const char array[5][6] = {
            {'A', 'B', 'C', 'D', 'E'},
            {'F', 'G', 'H', 'I', 'J'},
            {'K', 'L', 'M', 'N', 'O'},
            {'P', 'Q', 'Z', 'R', 'S', 'T'},
            {'U', 'V', 'W', 'X', 'Y'}
        };
        encrypt(array);
    }
}

Вот пример запуска:

********************************
**ENCRYPTION/DECRYPTION SYSTEM**
********************************
1. Code the message
2. Decode the message
3. EXIT
Make your choice: 1   
Please enter your message : test
TEST
35043435
Please enter your key : cortina
C O R T I N A 

Другие вопросы по теме