2015-11-09 116 views
0

此处的此代码用于反转字符串中的字。问题是它只能反转字符串中的第一个单词。当我跑过踪迹时,发现它在遇到语句后停止了。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)。它是否使这是一个错误的代码?

+0

您可能想要将其更改为'while(true)'。我不会说它是“坏”,但如果可以的话,你应该在“while”条款中加入一个明确的条件。这样,当你看到循环时,它说明了循环操作的条件。 –

+0

对于哪些输入您收到不良结果? – fghj

+0

反转整个字符串和反转字符串中的单词有什么区别? –

回答

0

问题的确在于输入方法。 cin >> string_variable将认为空格是分隔符。这就是为什么只有第一个字被输入。将cin >> s;替换为getline(cin, s);,它将正常工作。

0

首先我要指出的是,

cin >> stringObject; 

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

要阅读的空格字符,你应该使用这样

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.

getline功能如果你真的想检查与空终止字符的字符串,那么你应该考虑使用stringObject.c_str()它将C++风格的字符串转换为旧式C风格的字符串!

Check this for c_str

最后this可能对你有所帮助!

+0

[This](http://stackoverflow.com/a/6077274/4756309)答案表示提问者的代码将按照预期的方式工作,即空终止。 –

+0

@JamesRoot但重点是将std :: string将始终以''\ 0''结束,答案是否定的! – Deepanshu

+0

该答案中的评论线程也解释了它。首先,在这种情况下,它实际上是否存储在内存中并不重要,因为提交者不试图用其中的'\ 0'修改索引。其次,'operator []'返回与'c_str'相同数据的引用,所以必须有一个空终止字符。但是,这是假设C++ 11。 –

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; 
     } 
    } 
}