反转字符串中的单词

时间:2015-11-09 04:30:41

标签: c++ if-statement

此处的代码用于反转字符串中的单词。问题是它只反转字符串中的第一个单词。当我运行跟踪时,我发现它在遇到语句if(s[indexCount] == '\0') break;

后停止了

为什么每次第一个单词反转时代码都会变为空字符,即使第一个单词后面还有其他字符。

#include <iostream>
using namespace std;
int main()
{
    string s;
    char tchar;
    int indexCount=0,charCount=0,wordIndex;
    cin>>s;
    while(1){
        if(s[indexCount]==' ' && charCount==0) continue;
        if(s[indexCount]==' ' || s[indexCount]=='\0' ){
            wordIndex=indexCount-charCount;
            charCount=indexCount-1;
            while(charCount!=wordIndex && charCount>wordIndex){
                tchar=s[wordIndex];
                s[wordIndex]=s[charCount];
                s[charCount]=tchar;
                charCount--;
                wordIndex++;
            }
            if(s[indexCount] == '\0') break;
            indexCount++; charCount=0;
        }
        else{
            charCount++;
            indexCount++;
        }
    }
    cout<<"\nReveresed words in the string : \n\t"<<s<<endl;
   return 0;
}

我也在使用while(1)。它会使这个代码变坏吗?

3 个答案:

答案 0 :(得分:0)

问题确实在于输入方法。 cin >> string_variable会将空格视为分隔符。这就是为什么只输入第一个单词的原因。将cin >> s;替换为getline(cin, s);,它将正常运行。

答案 1 :(得分:0)

首先,我想指出

cin >> stringObject;

永远不会读空间角色!所以插入My name is geeksoul会导致上面的代码只读My并将其他所有内容保留在缓冲区中!

要阅读空格字符,您应该使用getline这样的功能

std::getline(std::cin, stringObject);

read about getline

第二个The standard doesn't say that in case of an std::string '\0' is any special character. Therefore, any compliant implementation of std::string should not treat '\0' as any special character. Unless of course a const char* is passed to a member function of a string, which is assumed to be null-terminated.

如果你真的想检查带有空终止字符的字符串,那么你应该考虑使用stringObject.c_str()将你的C ++样式字符串转换为旧式C样式字符串!

Check this for c_str

最后this可能会对您有所帮助!

答案 2 :(得分:0)

快速提示。 如果你反转整个字符串中的所有字符,然后是每对连续空格之间的所有字符,你将使用简单的代码实现相同的结果,如下所示:(注意,这可能无法编译或略有错误(避难所)编译或任何东西),但应传达基本的想法)

void reverseWords(std::string& aString) {
    std::reverse(aString.begin(), aString.end());
    size_t lastSpaceIndex = 0;
    for (size_t index = 0; index != aString.size(); ++index) {
        if (aString[index] == ' ') {
             std::reverse(aString.begin() + lastSpaceIndex + 1, aString.begin() + index);
             lastSpaceIndex = index;
        }
    }
}