Случайные и замещающие символы в выходных данных c

#c #arrays #string #random

#c #массивы #строка #Случайный

Вопрос:

Я пишу программу для обратного преобразования строки и вставки случайных символов между ними. Вот мой код: main.cpp

 #include <iostream>
#include <chrono>
#include <thread>
#include "encrypter.cpp"
using namespace std;
int main(int argc, char *argv[])
{
    char message[256];
 this_thread::sleep_for(chrono::milliseconds(1000));
 cout <<    "Make sure theres no one around you" << endl;
 this_thread::sleep_for(chrono::milliseconds(1000));
 cout <<    "Enter secret message ";
 cin.get(message, 256);
 cout <<    "message encrypted" <<  endl;
 enc(message);
 return 0;
}
  

encrypter.cpp

 #include <iostream>
#include <string>
int getRandom(int a, int b) {
    return a   (rand() % static_cast<int>(b - a   1));
}
using namespace std;
void enc(char message[256]) {
    int i = 0;
    int len =   strlen(message);
    int revlen =    len - 1;
    int wtpselector;
    int charselector;
    int encsim;
    char randchar[6] =  "@#$%amp;";
    char strreved[256];
    char strenc[1024];
    while (i <  len) {
        strreved[revlen]    =   message[i];
        i  ;
        revlen--;
    }
    revlen =    strlen(strreved);
    len =   revlen - 1;
    i = 0;
    encsim =    0;
    while (i <  revlen) {
        wtpselector =   getRandom(0, 4);
        charselector =  getRandom(0, 4);
        if (wtpselector ==  0) {
            strenc[encsim]  =   strreved[i];
            i  ;
            encsim  ;
        } else {
            strenc[encsim]  =   randchar[charselector];
            encsim  ;
        }
    }
    cout << strenc << endl;
}
  

Но на выходе есть много случайных символов, которых там не должно быть и которых нет в программе.
Нравится:

 Input: hello world
  
 Output: $%@$#amp;amp;damp;amp;@%$%1%row amp;#$$@%amp;ol@%#@%amp;1%amp;#$amp;#ehe$%%€@@8@amp;%@$#amp; #%@@%amp;¢amp;@%#amp;#$#@$#%%##amp;%#@amp;#amp;$8%#$#@#$@$@#%amp;amp;@amp;#@Q#$$#amp;¢%@% Q##amp;$@#{amp;amp;amp;amp;$@¢  $$$$@@@@@#amp;amp;amp;%%amp;amp;%{ $@¢v#amp;@amp;~u@@@@%amp;%¢
  

Пожалуйста, помогите!!!

Комментарии:

1. Есть ли какая-либо причина, по которой вы не используете std::string вместо массивов символов? Это значительно упростит задачу.

2. Вы, кажется, забыли, что char строки в C действительно называются строками с нулевым завершением .

3. Потому что это учебный проект о массивах символов.

Ответ №1:

Вы упустили две важные вещи:

  • когда вы объявляете массив, его значения не определены (независимо от того, что находится в памяти)
  • strlen засчитывается до первого появления символа »

Для того, чтобы ваш код работал, вы должны инициализировать массивы символов, что означает изменение этих двух строк:

 char strreved[256];
char strenc[1024];
  

Для:

 char strreved[256] = {0};
char strenc[1024] = {0};
  

Комментарии:

1. в чем разница между одним, имеющим пробел, и другим, которого нет? Также это исправит ошибку со случайными символами?

2. Пробел не имеет к этому никакого отношения, только вопрос стиля (я это исправил).