控制台无法正确读取输入字符串

时间:2018-08-22 18:08:54

标签: c++ winapi console c++17

我试图通过执行C ++样式来读取控制台输入

Platform.runlater(()->...

和C风格

public class Main extends Application {

    public static void main(String[] args) { launch(args); }

    @Override
    public void start(Stage primaryStage) {
        BorderPane root = new BorderPane();
        GridPane block = new GridPane();
        block.addRow(0, new Text("HELLO"));

        new Timer().schedule(
                new TimerTask() {
                    @Override
                    public void run() {
                        System.out.println("IN");
                        Platform.runLater(()->block.addRow(1, new Text("WORLD")));
                        System.out.println("OUT");
                    }
                },
                0,
                2*1000);//2 seconds

        root.setCenter(block);

        Scene scene = new Scene(root, 1280, 720);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}

但是,如果我输入一个字符串并按Enter,控制台中的光标将不会跳到下一行,它会跳到所输入命令所在行的第一列。再次按下Enter键将导致错误:

执行C ++样式的代码后出现错误消息框:

int main()
{
    std::string str;
    std::getline(std::cin, str);
    // also tested: std::cin >> str;
    return 0;
}

执行C样式代码后出错:

int main()
{
    char* str = new char[20];
    scanf_s("%s", str);
    delete[] str;
    return 0;
}

可能是什么问题?

1 个答案:

答案 0 :(得分:5)

您没有正确调用scanf_s(),而是像普通的scanf()一样调用它。来自documentation

  

scanfwscanf不同,scanf_swscanf_s要求为类型c,{{1} },CsS中包含的字符串控制集。以字符为单位的缓冲区大小将作为附加参数传递到指向缓冲区或变量的指针之后。例如,如果您正在读取一个字符串,则该字符串的缓冲区大小将按以下方式传递:

[]

因此,您需要编写:

char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9