c ++字符串有垃圾字符

时间:2014-04-29 02:02:05

标签: c++ string

我刚刚进入c ++而我正在开发基础62转换器程序。只要字符串长度小于4个字符,它就可以很好地用于长字符串函数和字符串长函数。然后事情就变得奇怪了。

#include <stdio.h>
#include <math.h>
#include <string>
#include <iostream>

using namespace std;

int char_to_int(char a){
    int b=(int)a;
    if(b-(int)'0'>=0&&b-(int)'0'<10)
        return b-(int)'0';
    if(b-(int)'a'>=0&&b-(int)'a'<26)
        return b-(int)'a'+10;
    return b-(int)'A'+36;
}

char int_to_char(int a){
    if(a<10)
        return (char)(a+(int)'0');
    if(a<36)
        return (char)((a-10)+(int)'a');
    return (char)((a-36)+(int)'A');
};

long stol(string a){
    int length=a.size()-1;
    int power=0;
    long total=0;
    for(;length>=0;length--){
        total+=(char_to_int(a[length])*(long)pow(62,power));
        power++;
    }
    return total;
}

string ltos(long a){
    int digits=(int)(log(a)/log(62))+1;
    char pieces[digits];
    int power=digits-1;
    for(int i=0;i<digits;i++){
        pieces[i]=int_to_char((int)(a/pow(62,power)));
        cout<<pieces[i]<<endl;
        a=a%(long)pow(62,power);
        power--;
    }
    return string(pieces);
}

int main(){
    string secret_password="test";
    long pass_long=stol(secret_password);
    string to_out=ltos(pass_long);
    cout<<sizeof(to_out)<<endl;
    cout<<to_out<<endl;
    cout<<to_out[4]<<endl;
    cout<<to_out[5]<<endl;
    cout<<to_out[6]<<endl;
}

输出如下:

t
e
s
t
4
test═ôZAx■(
═
ô
Z

正如你所看到的,最后还有一堆垃圾。我很困惑,因为我知道字符串的长度是4,但是接下来的几个字符也被打印出来。我刚刚开始使用c ++,直到现在才使用Java,我知道c ++中的字符串有一些细微差别。它可能与此有关,或者它可能与类型转换有关。

1 个答案:

答案 0 :(得分:1)

ltos中使用string(pieces);创建字符串时,字符串类需要以NULL结尾的字符串:

pieces[0] = 'T';
pieces[1] = 'e';
pieces[2] = 's';
pieces[3] = 't';
pieces[4] = '\0';  // Same as: pieces[4] = 0;

你的数组没有那个尾随0.所以你需要告诉字符串构造函数你有多少个字符:

return string(pieces, digits);