шифрование — не удается выяснить проблему с Caesar Cipher в переполнении стека

У меня возникли проблемы с выяснением, в чем проблема с моим кодом. Моя задача — записать шифр Цезаря в файл. Кажется, для отображения дополнительных символов, которые не должны быть там (время от времени), но в остальном он работает хорошо. Вот как это выглядит http://puu.sh/kC04F/2fc1bbd048.jpg
и вот код, спасибо заранее ^^

#include<iostream>
#include<conio.h>
#include<cstring>
#include<stdio.h>
using namespace std;
int main ()
{
char ch[20];
char conv[20];
int i;
cout<<"Enter a word "<<endl;
gets(ch);
int otm;
cout<<"Enter shift "<<endl;
cin>>otm;
int c=strlen(ch);

for(i=0; i<c; i++)
{
conv[i]=ch[i]+otm%26;
}

for(i=0; i<c; i++)
{
cout<<conv[i];
}

FILE *stream;
char ime[]="probe.txt";

stream=fopen(ime, "w");
fwrite(conv, strlen(conv), 1, stream);
fseek (stream, 0, SEEK_SET);

cout<<endl;
fflush(stream);
fclose(stream);system ("pause");
return 0;
}

0

Решение

Вопрос char conv[20]; содержит мусор. Затем вы заполняете его преобразованием, но никогда не добавляете нулевой терминатор в конец, чтобы указать конец строки. cout кажется, что мусор обрабатывает иначе, чем fwrite Таким образом, вы получите разницу в выводе в файл по сравнению с тем, что на экране. Чтобы исправить это изменение:

for (i = 0; i<c; i++)
{
conv[i] = ch[i] + otm % 26;
}

к

for (i = 0; i<c; i++)
{
conv[i] = ch[i] + otm % 26;
}
conv[c] = '\0';
1

Другие решения

Других решений пока нет …