c++ - getline() 出现丑陋的分段错误
问题描述
我需要getline()
一些空白的功能,包括用户输入的文本。但是我得到了一个分段错误,而不是用户输入。
这是一个最小化的示例:
#include <iostream>
#include <string>
#include <ctime>
/**
* Shows main menu.
*
* @version 1.0.0
*
* @return Returns selected option.
*/
unsigned int showMenu() {
unsigned int result;
printf("\n\nSimple transfer\n===============\n\n");
printf("Options:\n-----------\n");
printf(" 1: Receive\n");
printf(" 2: Send\n");
printf("Enter any other number to exit.\n\n");
printf("?: ");
scanf("%u", &result);
return result;
}
// Some functions.
/**
* Entry point.
*
* @version 1.2.0
*
* @return Returns result code.
*/
int main() {
// Initialization.
setbuf(stdout, NULL);
bool expectData;
std::string inMessage, outMessage;
// Run.
while (true) {
switch (showMenu()) {
// Receiving mode.
case 1:
// Some code.
std::cout << "Received.\n";
break;
// Sending mode.
case 2:
outMessage = "Dies ist eine Testnachricht.";
getline(std::cin, outMessage);
printf("Sending: ");
for (unsigned int i = 0; i <= outMessage.length() -1; i++) {
// Some code.
printf("%c", outMessage[i]);
}
printf("\n");
break;
// Exit.
default:
printf("Bye.\n");
return 0;
}
}
}
是什么原因,我该如何解决?
解决方案
你必须使用:
std::cin.ignore();
在您的 之前getline(...);
,因为它正在读取您的换行符,这是由按回车键而不是让您键入消息引起的。有关更多详细信息,请参阅此问题。
你得到了Expression: string subscript out of range
异常,因为你试图在这里下标一个空字符串:printf("%c", outMessage[i]);
编辑:正如@Johnny Mopp 在评论中指出的那样,outMessage.length()
返回 size_t 类型,它是无符号类型。然后从无符号 0 中减去 1,将其溢出为“大”数,因此 for 循环尝试打印很长的不存在的字符串。
推荐阅读
- c# - 我正在尝试从 sql 数据库登录,但不断收到此错误
- java - MyEclipse 上的 Tomcat 启动无限时间启动
- c - 如何在C程序中查找M是否实际上是2power(2n)+ 1的输出
- html - 网页抓取使用 swift 提交表单
- python-3.x - StopOver 签名板与 Python Django 应用程序的集成
- python - 没有名为“darkflow.cython_utils.cy_yolo_findboxes”的模块
- android - 从 Android 共享意图下载文件
- fonts - 用于嵌入式系统的 CJK 字体
- java - 使用 JsonObjectRequest 和 GET 请求发送 JSON 正文
- android - 使用 executor 在 android 中运行下载管理器任务