此处的代码用于反转字符串中的单词。问题是它只反转字符串中的第一个单词。当我运行跟踪时,我发现它在遇到语句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 :(得分:0)
问题确实在于输入方法。 cin >> string_variable
会将空格视为分隔符。这就是为什么只输入第一个单词的原因。将cin >> s;
替换为getline(cin, s);
,它将正常运行。
答案 1 :(得分:0)
首先,我想指出
cin >> stringObject;
永远不会读空间角色!所以插入My name is geeksoul
会导致上面的代码只读My
并将其他所有内容保留在缓冲区中!
要阅读空格字符,您应该使用getline
这样的功能
std::getline(std::cin, stringObject);
第二个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样式字符串!
最后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;
}
}
}