std::string input; std::getline(std::cin, input);
时间: 2024-09-21 13:13:39 浏览: 60
`std::getline` 是 C++ 标准库中的一个函数,用于从标准输入流(如 `std::cin`)读取一行文本,直到遇到换行符为止。这与 `std::cin >> input` 不同,后者会在遇到第一个空格时停止读取,假设 `input` 是一个预期接收完整单词的变量。
下面是一个使用 `std::getline` 的示例,展示如何将用户的多行输入读取到 `std::string` 中:
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string longInput;
cout << "Enter multiple lines of text (hit Enter to stop):" << endl;
getline(cin, longInput);
cout << "You entered: " << longInput << endl;
return 0;
}
```
在这个例子中,用户可以连续输入多行文本,直到按下回车键结束输入。`getline` 会把输入的每一行保存到 `longInput` 变量中。
相关问题
#include <iostream> #include <string> #include <ctime> #include <csignal> #include "Automaton.h" #ifdef _WIN32 #include <windows.h> #else #include <unistd.h> #endif bool isRunning = true; Automaton* automaton; void wait(int ms) { #ifdef _WIN32 Sleep(ms); #else usleep(ms * 1000); #endif } void handleCtrlC(int); int main() { srand(time(NULL)); int lines = -1, columns = -1; std::cout << "Lines?" << std::endl; std::cin >> lines; std::cout << "Columns?" << std::endl; std::cin >> columns; std::cout << "Generate random patterns? [y/N]" << std::endl; std::string yn; std::cin >> yn; automaton = new Automaton(lines, columns); if (yn == "y" || yn == "Y") automaton->init(true); else automaton->init(); std::string s; std::getline(std::cin, s); signal(SIGINT, handleCtrlC);while (true) { if (isRunning) { std::cout << "[RUNNING]" << std::endl; automaton->run(); automaton->display(); } wait(1000); } } void handleCtrlC(int) { isRunning = false; std::cout << "[PAUSED]" << std::endl; while (true) { automaton->display(); std::cout << "Press Enter to continue, S to save, L to load, C to change cell state, R to revert to previous generation, or Q to quit." << std::endl; std::string input; std::getline(std::cin, input); if (input.empty()) { std::cout << "[CONTINUE]" << std::endl; break; } else if (input == "S" || input == "s") { std::cout << "Enter file name: "; std::getline(std::cin, input); automaton->saveToFile(input); } else if (input == "L" || input == "l") { std::cout << "Enter file name: "; std::getline(std::cin, input); automaton->loadFromFile(input); } else if (input == "C" || input == "c") { std::cout << "Enter cell coordinates (x,y): "; std::getline(std::cin, input); int x = std::stoi(input.substr(0, input.find(','))); int y = std::stoi(input.substr(input.find(',') + 1)); automaton->changeCellState(x, y); } else if (input == "R" || input == "r") { automaton->revertToPreviousGeneration(); } else if (input == "Q" || input == "q") { std::cout << "[EXIT]" << std::endl; exit(0); } else { std::cout << "Invalid input." << std::endl; } } isRunning = true; signal(SIGINT, handleCtrlC); } 介绍这段代码思路
这段代码实现了一个元胞自动机,它可以模拟生命游戏等各种自动化过程。它通过在二维平面上的单元格之间应用简单的规则来模拟各种动态系统。用户可以指定行和列的数量,并选择是否使用随机模式。然后,程序将在一个死循环中运行,每秒钟更新一次,并显示当前状态。当用户按下 CTRL-C 时,程序会暂停,并等待用户输入命令。用户可以选择继续运行、保存状态、加载状态、更改单元格状态、回退到上一个状态或退出程序。一旦用户完成输入,程序将继续运行,并等待下一个 CTRL-C 信号。这个程序使用了一些 C++ 标准库函数和系统库函数,如 std::cout, std::cin, std::getline, signal 等。同时,它也使用了自定义的 Automaton 类,用来实现元胞自动机的各种操作。
#include <iostream> #include <string> #include <cstring> #include <ctype.h> std::string solution(std::string words, std::string msg){ std::string result; // TODO: int tStrLenW = words.length(); int tStrLenM = msg.length(); int tWordsFlag = 0; int tMsgFlag = 0; char* pCharText = new char[tStrLenW + 1]; memset(pCharText, ' ', tStrLenW); pCharText[tStrLenM] = '\0'; while(tStrLenW > tWordsFlag && tStrLenM > tMsgFlag) { if( words[tWordsFlag] == msg[tMsgFlag] ) { pCharText[tMsgFlag] = msg[tMsgFlag]; //strcat(pCharText, &msg[tMsgFlag]); tMsgFlag++; tWordsFlag++; } else { tWordsFlag++; tMsgFlag = 0; } } if(pCharText == msg) result = "Yes"; else result = "No"; delete[] pCharText; pCharText = nullptr; return result; } int main() { std::string words; std::string msg; getline(std::cin, words);; getline(std::cin, msg);; std::string result = solution(words, msg); std::cout<<result<<std::endl; return 0; } 程序的缺陷和不足,修改示例
程序的缺陷和不足:
1. 缺乏输入校验,需要对输入进行判断,判断输入是否为空或者是否符合要求。
2. 程序中使用了 C 风格的字符串操作函数,建议改用 C++ 的字符串操作方式。
3. 程序中使用了动态内存分配,但没有考虑释放内存的问题,可能会导致内存泄漏。
4. 程序的逻辑存在问题,如果输入的 words 和 msg 相同,也会返回 "No" 的结果。
5. 变量命名不够规范,不易理解。
修改示例:
1. 对输入进行判断,可以在输入之前添加代码进行判断,判断输入是否为空或者是否符合要求。
2. 使用 string 类型代替 char*,使用 string 的成员函数代替 C 风格的字符串操作函数。
3. 在动态内存分配之后,需要手动释放内存,防止内存泄漏。
4. 将比较字符串是否相等的语句改为使用 string 类型的比较操作符 "==",避免逻辑错误。
5. 变量命名应该具有描述性,易于理解和维护。
修改后的示例代码如下:
```
#include <iostream>
#include <string>
std::string solution(std::string words, std::string msg){
std::string result;
if (words.empty() || msg.empty()) {
return "Input is invalid!";
}
int tStrLenW = words.length();
int tStrLenM = msg.length();
int tWordsFlag = 0;
int tMsgFlag = 0;
std::string pCharText(tStrLenW, ' ');
while(tStrLenW > tWordsFlag && tStrLenM > tMsgFlag) {
if( words[tWordsFlag] == msg[tMsgFlag] ) {
pCharText[tMsgFlag] = msg[tMsgFlag];
tMsgFlag++;
tWordsFlag++;
} else {
tWordsFlag++;
tMsgFlag = 0;
}
}
if(pCharText == msg) {
result = "Yes";
} else {
result = "No";
}
return result;
}
int main() {
std::string words;
std::string msg;
std::getline(std::cin, words);
std::getline(std::cin, msg);
std::string result = solution(words, msg);
std::cout<<result<<std::endl;
return 0;
}
```
阅读全文