分词逆序输出

下午做一道题准备准备期末考试。 Given a valid identifier in C programs, please write a program to reverse it by respectively reversing each part separated by ‘_’.
INPUT 3 nt_45 _me_ abc_123_456
OUTPUT tn_54 _em_ cba_321_654
看完后就开始敲了,思路就是扫一遍string,用hold去存贮还未逆序的单词。遇到'_'就开始逆序
,之后清空hold,直到结束。
信心满满的去敲了一会儿,结果发现有好多结果错误,最后发现是由于一开始没有想好start 和end到底要放在哪里,结果出现了不同的将hold赋值到s的情况,最后我将思路就定格在把start放在第一个有字符的地方,end提前i到达i的位置,遇到'_'就将end和start挪向下一个位置。
在hold往s传递是也有思维障碍,总是想不好结束位置,最后在大脑中构想两个数组,每一次的长度就是end-start
s从start开始向右
hold从end-start-1开始向左
一个个赋值。
代码如下:如有不足,欢迎更正

#include
#include
using namespace std;
void rever(string &s);
int main() {
    int N;
    string s;
    cin >> N;
    while (N--) {
        cin >> s;
        rever(s);
        cout << s << endl;
    }
    return 0;
}
void rever(string &s) {
    string hold;
    int size = s.size(), start = 0, end = start;
    for (int i = 0; i < size; i++) {
    if (s[i] != '_') {
    hold += s[i];
    end++;
    if (i == size - 1) {
        for (int j = 0; j < end - start; j++) {
            s[start + j] = hold[end - start - j - 1];
        }
    }
    } else if (hold.size() != 0) {
        for (int j = 0; j < end - start; j++) {
            s[start + j] = hold[end - start - j - 1];
        }
        hold.clear();
        start = end = i + 1;
    } else {
        start = end = i + 1;
    }
}

  

原文地址:https://www.cnblogs.com/eggplant-is-me/p/6720082.html