2016-06-09 43 views
2

我正在制作莫尔斯码转换器,它完成了,我解决了这个问题,但我不明白它。 picture represents the problem一个奇怪的字符出现在我的字符数组中的第一个字符

这是一些代码:

string txt,result; 
int x; 
cout << "Enter the text you want to convert\n"; 
getline (cin,txt); 
x = txt.size(); 
char text[x]; 
strcat(text,txt.c_str()); 

cout<<"txt = "<<txt<<"\n"<<"text = "<<text<<endl; 

我只是想知道那是什么char,为什么它会出现。

+2

发布可以发布为图片的内容不好。 – MikeCAT

+0

坏字符是随机的,后面跟纯运气的'\ 0'。使用'strcpy',而不是'strcat'。 'x'应该是'txt.size()+ 1'(对于结尾''\ 0'') – manuell

回答

7
  • 您没有初始化text,所以它有一个不确定的值。在典型情况下,这些奇怪的角色来自你记忆中的某个地方。在使用前初始化它。我认为使用strcpy()而不是strcat()在这种情况下更好。标准C++不支持变长数组。我建议你应该使用new[]
  • 不要忘记分配空间来终止空字符。

试试这个:

string txt, result; 
int x; 
cout << "Enter the text you want to convert\n"; 
getline(cin, txt); 
x = txt.size() + 1; // +1 for terminating null character 
char *text = new char[x]; 
strcpy(text, txt.c_str()); 

cout << "txt = " << txt << "\n" << "text = " << text << endl; 

// do some other work with text 

// after finished using text 
delete[] text; 
3

strcat通过搜索目标字符串的结尾(通过寻找空终止),然后写其他字符有追加到一个字符数组。

但是,你有一个未初始化的内存数组,所以字符串将被连接的实际位置是不确定的。你可以说:

text[0] = 0; 
strcat(text, txt.c_str()); 

或者只是:

strcpy(text, txt.c_str()); 

此外,您不能使用非const变量初始化数组,所以你应该或者使用新的分配内存:

text = new char[x]; 

或只使用一个std::string和你去修改它:

std::string text = txt;