刚刚ac了一个输入字符串的杭电题,发现坑好多呀,
杭电ACM 1062: Text Reverse
原题如下:
/>解决问题:
这道翻转字符串题的难点就在于,如何输入一个带有空格的字符串,具体的函数讲解,请看我的上一篇文章:c++输入带空格字符串。
这里补充一点,gets()函数,也是整行读取字符串,遇到换行符就结束读取,并把换行符当成 \0
写入到末尾。
代码展示:
#include<iostream> using namespace std; int main(){ int n, x, y; // x记录上一次翻转字符的最高位的索引号 string st; cin>>n; getchar(); while(n--){ x=0; getline(cin, st); for(int i=0;i<st.length(); i++){ if (isspace(st[i])){ // isspace()判断是否是空格,然后翻转前面的字符 y = i; reverse(st.begin()+x, st.begin() + y); // reverse 交换数据 x = y+1; } else if (i == (st.length()-1)){ // 字符串的最后一位,前面的也要翻转 y = i+1; reverse(st.begin() + x, st.begin() + y); } } cout<<st<<endl; } return 1; }
解释一下代码,按照题意,有两种情况是需要反转的。一种是遇到空格的时候,翻转前面的字符串,第二种是到最后一位时,也是需要翻转其前面的字符串。
另外需要注意,reverse
这个翻转函数的坑,用于反转在[first,last)范围内的顺序(包括first指向的元素,不包括last指向的元素),reverse 函数没有返回值,他如同 Python 列表区间一样,包前不包后。
所以上面的 y
都会加1,不要觉得有问题。
总结:
遇到了读取带空格字符串的问题,现在也是解决了。
冲冲冲