2016-12-19 5 views
2

Я делаю простую программу шифрования на основе ascii. ниже мой код, и я не уверен, почему я получаю значение мусора в конце при печати скопированной строки.копирование массива символов в другой массив дает значение для мусора

output results

#include <iostream> 
#include <conio.h> 

using namespace std; 

void encrypt(char []); 
void convertToAscii(char [], char []); 
int main() 
{ 
    char userString [] ="This is a string"; 
    const int size= sizeof(userString); 
    char copyString[size]; 
    convertToAscii(userString, copyString); 
    cout<<copyString; 
    _getch(); 
    return 0; 
} 

void convertToAscii(char s[], char* cs) 
{ 
    for(int i=0; s[i] != '\0'; i++) 
    { 
     int x = s[i]; 
     x= x+3; 
     char y= x; 
     cs[i]=y; 
     cout<< x<<" "<<y<<"\n"; 
    } 
} 
+0

в основном конвертирует один символ другого на основе ASCII, поэтому +3 преобразует ASCII с этого конкретного символа в другой char.i.e T станет W amd и так далее. –

+0

И, '}' + 3 будет вне диапазона для ASCII. Чтобы обернуть вокруг, 'char y = x% 128;' So, '}' становится '\ x00' (␀), '~' становится '\ x01' (␁) и '\ x7F' (␡) становится '\ x02 '(␂). –

ответ

0

Просто добавьте Нуль в строку назначения

void convertToAscii(char s[], char* cs) 
{ 
    size_t i = 0; 

    for(; s[i] != '\0'; i++) 
    { 
     int x = s[i]; 
     x= x+3; 
     char y= x; 
     cs[i]=y; 
     cout<< x<<" "<<y<<"\n"; 
    } 

    cs[i] = '\0'; 
} 

Другой способ заключается в следующем

char * convertToAscii(cosnt char *s, char *cs) 
^^^^^^     ^^^^^ 
{ 
    char *p = cs; 

    for (; (*cs = *s) != '\0'; ++cs, ++s) *cs += 3; 

    return p; 
} 
+0

спасибо, что это сработало. :) –

+0

@AQHassaan Нет вообще. Добро пожаловать.:) –

3

В C вы должны обнулить-аннулирует ваши строки. Вы признаете, что, поскольку ваша функция convertToAscii() ищет нулевой ограничитель на входе; но он не помещает нулевой ограничитель на выходе, поэтому методы, такие как cout's operator<<, не знают, где заканчивается значение copyString.

Конечно, для того чтобы convertToAscii функции в нуль-прекратить вашу строку, вам необходимо выделить дополнительное пространство для '\0' в вызывающем:

char copyString[size + 1]; 
//     ^^^ 
+0

'sizeof (userString)' is 'strlen (userString) + 1'. Следовательно, 'char copyString [size];' должно быть адекватным. –

+0

Могу упомянуть, что 'char copyString [size + 1]' является VLA, а не стандартным C++. – NathanOliver

Смежные вопросы