将char数组复制到另一个数组中会产生垃圾值

时间:2016-12-19 18:22:25

标签: c++ arrays string character-encoding garbage

我在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";
    }
}

2 个答案:

答案 0 :(得分:3)

在C中,您必须以空字符串终止字符串。您认识到这一点,因为您的convertToAscii()函数正在输入中查找空终止符;但是它没有在输出上放置一个null终止符,所以像cout的operator<<这样的方法不知道copyString的值在哪里结束。

当然,为了让convertToAscii函数使字符串无效终止,您需要在调用者中为'\0'分配额外的空间:

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

答案 1 :(得分: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;  
}