C/C++读入多行字符串string

本文介绍了使用C++从流中读取字符串的方法,包括如何读取不包含空格的字符串以及如何使用getline函数读取包含空格的多行字符串,并解决了一些常见的编程问题。

  因为从流中读入数据保存到string中,string会遇到空格就停止录入。这样当我们输入一行带空格的字符串,就要考虑getline函数,从流中读入一行字符串。

1. 读入不含空格字符串

  首先我要介绍一下标准C++字符串类string,它包含在”string”头文件中,记住不是string.h或者cstring头文件。两者头文件中都是包含对字符串数组处理的函数声明,前者标准C语言头文件,而后者是标准C++头文件,功能一样。
  因为标准C++类string的定义和处理在标准命名空间,所以还要指明限定,例如:
  using namespace std;
  std 代表标准命名空间。 :: 则是作用域运算符,在这里用于定位到std命名空间。当然也可以using std::string。

#include<string>
using namespace std;

string str;
cin>>str;

2. 读入包含空格字符串

  为了简略,下面头文件和命名空间声明不再添加到程序例子中。

2.1 读入一行字符串

  getline(istream &in,string,s)从流中读入一行字符串,直到遇到换行符。

string str;
getline(cin,str);

2.2 单纯读入多行字符串

  例如读入三行字符串:

string str[3];
for(int i=0;i<3;i++)
    getline(cin,str[i]);

2.3 包含其他输入后读入多行字符串

  例如一些编程题要求先输入字符串行数,然后再一行一行读入字符串。如果正常顺写编程的话,会发现第一行字符串读入的是空,后续才能正常录入每行字符串。
  这是因为第一行输入一个int数据后,换行符并没有被忽略,直接被准备读入第一行字符串的getline俘获。
  所以需要在第一行输入一个int数据后,调用cin.ignore()忽略下面的一个流录入,将其抛弃。

    int N;
    cin>>N;
    cin.ignore();  //取消换行键的读入
    string strCinLine[100];
    for(int i =0;i<N;i++)
        getline(cin,strCinLine[i]);

  或者给strCinLine动态申请空间,节省空间开销。

    int N;
    cin>>N;
    cin.ignore();  //取消换行键的读入
    string* strCinLine = new string[N];
    for(int i =0;i<N;i++)
        getline(cin,strCinLine[i]);

    delete []strCinLine; //记得释放动态空间
    strCinLine = NULL;

个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:优快云 无鞋童鞋

### C++多行字符串输入方法 在 C++ 中,可以通过多种方式实现多行字符串输入。以下是几种常见的方法及其示例: #### 方法一:使用 `std::getline` 函数 `std::getline` 是一种简单而有效的方法,用于从标准输入读取整行数据。如果需要连续多次调用该函数,则可以逐行获取用户的多行输入。 ```cpp #include <iostream> #include <string> int main() { std::string line; std::string result; while (std::getline(std::cin, line)) { if (line.empty()) break; // 假设以空行为结束标志 result += line + "\n"; } std::cout << "Input was:\n" << result; return 0; } ``` 上述代码通过循环不断读取每一行的内容并将其拼接起来[^2]。 --- #### 方法二:利用原始字符串字面量(Raw String Literals) 自 C++11 起支持原始字符串字面量功能,可以直接定义跨越多行字符串而不需额外转义特殊字符。虽然此特性主要用于声明而非动态输入,但在某些场景下仍能间接辅助完成任务。 ```cpp #include <iostream> #include <string> int main() { const std::string rawString = R"(这是第一行. 这是第二行. 这是第三行.)"; std::cout << "Multi-line string example:" << std::endl << rawString; return 0; } ``` 这里展示了如何创建一个多行静态字符串实例[^3]。 --- #### 方法三:借助 `std::istringstream` 当希望解析来自单次大段文本输入中的多个部分时,可以考虑结合 `std::getline` 和 `std::istringstream` 使用。这种方式尤其适合处理复杂的分隔逻辑或格式化需求。 ```cpp #include <iostream> #include <sstream> #include <string> int main() { std::string input; getline(std::cin, input); // 获取一大段输入 std::istringstream stream(input); std::string line; while (std::getline(stream, line, '\n')) { // 自定义分割符'\n' std::cout << "[Line]: " << line << std::endl; } return 0; } ``` 这段程序先一次性接收所有用户键入的数据存入变量 `input` 中,再交由字符串对象逐步拆解分析每一段子串。 --- #### 方法四:手动连接各独立短句构成整体效果 对于那些严格限定每次仅允许提交固定长度字段的应用场合来说,可通过反复询问直至满足条件为止的方式累积最终结果集。 ```cpp #include <iostream> #include <vector> #include <string> using namespace std; int main(){ vector<string> lines; string temp; cout<<"Enter multiple lines of text. Type 'END' on a new line to finish."<< endl; do{ getline(cin,temp); if(temp!="END") lines.push_back(temp); }while(temp!="END"); cout<<"\nThe entered multiline content:"<<endl; for(auto& s :lines){ cout<<s<<endl; } return 0; } ``` 以上脚本引导使用者持续提供新资料直到遇见特定终止信号才停止收集过程[^4]。 --- ### 总结 综上所述,在实际开发过程中可以根据具体应用场景灵活选用不同的技术手段达成目标——无论是单纯依赖基础库接口还是综合运用高级工具类均各有千秋。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值