反转字符串:垃圾值

时间:2013-04-01 08:27:29

标签: c++

我编写了一个代码来反转字符串

#include < iostream >
#include < cstring >

using namespace std;

string Reversal(char * s);

int main()
{
    char str[25];

    cout << "Enter a Name :";

    cin.get(str, 25);
    cout << "You have entered: " << str;

    cout << "\nReversed : " << Reversal(str);
    return 0;
}

string Reversal(char * s)
{
    int count = strlen(s);
    char temp[count];
    for (int i = 0; i < count; i++)
    {
        temp[i] = * (s + (count - 1) - i);
    }
    return temp;
}

在下面提到了链接,使cin以空格为输入:

How to cin Space in c++?

但是输出显示了几个垃圾字符?有什么建议为何如此? enter image description here

2 个答案:

答案 0 :(得分:4)

当您从std::string隐式构造temp时,后者应该是NUL终止的,但事实并非如此。

更改

return temp;

return std::string(temp, count);

这使用了一个不同的构造函数,一个采用显式字符计数的构造函数,并且不希望temp被NUL终止。

答案 1 :(得分:2)

临时数组中的最后一个字符应该以null结尾。使它比输入字符串的大小长1。将最后一个字符设为空字符('\0')。

string Reversal(char *s)
{
 int count=strlen(s);
 char temp[count+1]; //make your array 1 more than the length of the input string
 for (int i=0;i<count;i++)
 {
   temp[i]= *(s+(count-1)-i);
 }

 temp[count] = '\0'; //null-terminate your array so that the program knows when your string ends
 return temp;
}

空字符指定字符串的结尾。通常它是一个全0位的字节。如果您没有将此指定为临时数组的最后一个字符,程序将不知道字符数组的结尾何时结束。它将保持包含每个字符,直到找到'\0'