C++ C+;中的getline()存在难看的分段错误+;

C++ C+;中的getline()存在难看的分段错误+;,c++,segmentation-fault,g++,getline,C++,Segmentation Fault,G++,Getline,) 在我的研究中,我正在编写一个简单的C++代码来进行练习。 在这里,我需要一个getline()函数来处理一些空格,包括用户输入的文本。 但不是用户输入,而是分段错误 以下是一个示例: #include <iostream> #include <string> #include <ctime> /** * Shows main menu. * * @version 1.0.0 * * @return Returns selected option

)

在我的研究中,我正在编写一个简单的C++代码来进行练习。 在这里,我需要一个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;
        }
    }
}
#包括
#包括
#包括
/**
*显示主菜单。
*
*@version 1.0.0
*
*@return返回所选选项。
*/
unsigned int showMenu(){
无符号整数结果;
printf(“\n\n简单传输\n===================\n\n”);
printf(“选项:\n------\n”);
printf(“1:Receive\n”);
printf(“2:Send\n”);
printf(“输入要退出的任何其他数字。\n\n”);
printf(“?:”);
scanf(“%u”,&result);
返回结果;
}
//一些功能。
/**
*入口点。
*
*@version 1.2.0
*
*@return返回结果代码。
*/
int main(){
//初始化。
setbuf(标准输出,空);
布尔期望数据;
std::字符串inMessage,outMessage;
//跑。
while(true){
开关(showMenu()){
//接收模式。
案例1:
//一些代码。
std::cout您必须使用:

std::cin.ignore();
在您的
获取行(…);
之前,因为它正在读取由于按enter键而导致的新行字符,而不是让您键入消息。有关详细信息,请参阅

您将获得
表达式:字符串下标超出范围
异常,因为您试图在此处下标一个空字符串:
printf(“%c”,outMessage[i]);


编辑:正如@Johnny Mopp在评论中指出的,
outMessage.length()
返回size\u t type,这是无符号类型。然后从无符号0减去1,使其溢出为一个“大”数字,因此for循环尝试打印非常长的不存在的字符串。

为什么要初始化outMessage,然后读取它?什么是中断程序的输入?为什么要使用
printf
aC++ C++代码中的ND<代码> SCAFF <代码>?你甚至不一致,因为你将它与C++ IO库混合使用。总是检查SCANF的返回值。请参阅进一步的信息。此外,你可能想使用调试器来查明程序到底在哪里崩溃。和.使用
g++-Wall-Wextra-g
编译分段错误是很漂亮的。特别是与程序的备选方案相比,它会默默地破坏内存。不要让我们悬而未决。告诉我们如何修复它。只是要澄清:
size\u t
实际上总是一个未签名的错误type@PeteBecker我提出了一个解决方案,使示例变得简单e工作。@CruzJean是的,我是说“一些”未签名的type@Hawky--抱歉,我不清楚。
ignore()
是解决方案的一部分;它消除了眼前的问题。但是,如果有人在调用
getline()
时按enter键,结果是长度为零的字符串,会发生什么情况?循环条件应该是
I