这些垃圾值来自哪里?

时间:2016-06-09 13:15:25

标签: c++ string

我编写了这个函数来反转字符串中单词的顺序,该函数按预期运行,直到它读取了两个单词然后开始出现意外行为:

string ReverseString(string InputString){

int EndOfGroup = 0;

string ReversedString = " ";
int k = 0;

ReversedString.resize(InputString.size());
for (int i = InputString.length();  i > 0; i--){
    if (isspace(InputString[i]))
    {           
        EndOfGroup = i;

        for (int j = i; j >= EndOfGroup && j < InputString.length(); j++)
        {

            ReversedString[k] = InputString[j] ;
            k++;

        }
    }

}

我的意思是行为意外的是,一旦我将一个字符串传递给函数,它就会开始用垃圾值填充ReversedString变量,直到越界为止。

这就是程序崩溃的重点:

InputString "the brown fox died"    
ReversedString  " died fox died brownÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««îþîþ"  
j   9   
i   3
EndOfGroup  3   
k   20

这不是一个重复的问题,因为我的方法与现有的方法不同。

2 个答案:

答案 0 :(得分:1)

您只在符合space标志

时复制该字词
if (isspace(InputString[i]))
{
    //start of copying...

这意味着你不会复制第一部作品(the字之前没有空格)。

resize()方法填充字符串null字符(due to reference)并且它们可能显示为

    ÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««îþîþ

你需要处理第一个单词

    for (int i = InputString.length();  i >= 0; i--){
        if (isspace(InputString[i]) || i == 0)

使用

提供一些默认char而不是null也是一件好事
    ReversedString.resize(InputString.size(), ' ');

答案 1 :(得分:1)

考虑内循环,

for (int j = i; j >= EndOfGroup && j < InputString.length(); j++)

对于第一个词,这是好的,现在对于第二个词 - 条件是否正确?

请记住,您正在使用递增索引k ...

写入反向字符串