C++不定长输入【string类型格式化输入到数组】

        在刷算法题的时候总是会遇到需要处理格式化输入的问题,这里记录下将string类型的数据,格式化输入到vector数组中,提供两种方法:

1、C语言中的strtok。

        因为strtok为不安全函数,这里使用strtok_r.

直接看代码:

example:

void formatStringTovector()
{
    string line;
    getline(cin, line);
    char *S = (char *)line.c_str();
    char *context = NULL;
    char *target = strtok_r(S, ",", &context);
    vector<int> arr;
    while(target != NULL) {
        int num = stoi(target);
        arr.push_back(num);
        target = strtok_r(NULL, "," , &context);
    }
    int total = arr.back();
    arr.pop_back();
    cout << "tatal : " << total << endl;
    for(auto x : arr) {
        cout << x << " ";
    }
    cout << endl;
}
<think>好的,我现在需要帮助用户了解如何用C++实现字符串或数组的倒序输出。用户已经提供了一些参考资料,包括不同的方法和代码示例。我需要整理这些信息,给出清晰的方法说明,并确保符合格式要求,比如使用正确的LaTeX格式和引用标识。 首先,我应该先看看用户提供的引用内容。引用[1]展示了一个使用字符数组和指针的方法,引用[2]和[3]分别用了动态数组string类的方法,引用[4]提到了四种方法,包括toCharArray、递归、StringBuffer和字符串串联,而引用[5]是关于二维数组的逆序输出。不过用户的问题集中在字符串或一维数组的倒序,可能暂时不需要涉及二维数组。 接下来,我需要将这些方法分门别类,可能分为数组方法、指针操作、动态内存、string类以及STL算法。每种方法都需要示例代码,并指出其优缺点,比如指针操作效率高但容易出错,STL方法简洁但需要了解库函数等。 需要注意的是,用户提供的代码中有一些可能存在的错误,比如引用[1]中的代码里,注释提到*p--和*p++的问题,原代码中的*p--;可能是个错误,应该是指针移动的操作。需要检查示例代码的正确性,可能需要修正。 另外,用户要求生成相关问题,我需要根据内容提出相关的问题,比如不同方法的比较、性能分析、应用场景等。还要确保所有数学表达式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式不多,主要关注代码和文字说明。 最后,要确保回答结构清晰,分点说明每种方法,并附上代码示例,正确添加引用标识。同时,语言要口语化,避免使用专业术语过于密集,让用户容易理解。</think>### C++实现字符串/数组倒序输出的方法 以下是5种实现倒序输出的方法,涵盖字符数组、动态内存、string类及STL库: #### 1. 字符数组指针操作法 通过指针移动实现反向遍历: ```cpp #include <iostream> #include <cstring> using namespace std; int main() { char a[20]; cin.get(a, 20); int n = strlen(a); // 计算有效长度 char *p = a + n -1; // 指向最后一个字符 while (p >= a) { // 逆向遍历 cout << *p--; } } ``` **优点**:内存效率高 **缺点**:需手动管理指针边界[^1] #### 2. 动态内存分配法 使用`calloc`创建动态数组: ```cpp #include <stdio.h> #include <stdlib.h> int main() { char *str = (char*)calloc(100, sizeof(char)); gets(str); int len = strlen(str); for(int i=len-1; i>=0; i--){ putchar(str[i]); } free(str); } ``` **注意**:需确保内存释放[^2] #### 3. string类拼接法 利用字符串拼接特性: ```cpp #include <string> using namespace std; string reverseString(string s) { string res; for(int i = s.length()-1; i >= 0; i--) { res += s[i]; } return res; } ``` **特点**:代码简洁,支持中文字符[^3] #### 4. STL算法实现法 使用`reverse`算法: ```cpp #include <algorithm> #include <iostream> using namespace std; int main() { string s = "Hello"; reverse(s.begin(), s.end()); cout << s; // 输出olleH } ``` **优势**:单行代码实现,时间复杂度$O(n)$[^4] #### 5. 数组索引交换法 经典位置交换算法: ```cpp void reverseArray(int arr[], int size) { for(int i=0; i<size/2; i++){ swap(arr[i], arr[size-1-i]); } } ``` **数学原理**:交换次数为$\lfloor n/2 \rfloor$,时间复杂度$O(n)$ ### 方法对比表 | 方法 | 适用类型 | 内存效率 | 代码复杂度 | |-----------------|------------|--------|----------| | 指针操作 | 字符数组 | 高 | 中 | | 动态内存 | 不定长字符串| 中 | 高 | | string拼接 | STL字符串 | 低 | 低 | | STL reverse | 容器/数组 | 高 | 极低 | | 数组索引交换 | 数值数组 | 高 | 低 | ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值