ฉันจะอ่านสตริงรูปแบบของความยาวผันแปรใน C ++ จาก stdin ได้อย่างไร

2020-02-15 c++ io

ขอโทษสำหรับคำถามที่โง่ แต่ฉันไม่สามารถหาคำตอบที่ชัดเจน

ฉันต้องอ่านจาก stdin ก่อน int n มีขนาดของอาร์เรย์แล้วค่าจำนวนเต็มจากสตริงในรูปแบบ "1 2 3 4 5 6" กับองค์ประกอบ n

หากฉันรู้จำนวนพารามิเตอร์ ณ เวลารวบรวมฉันสามารถใช้บางอย่างเช่น scanf (หรือทางเลือกที่ปลอดภัย) ด้วยสตริงรูปแบบเช่น "%d %d %d %d %d %d" แต่ที่นี่ฉันจะรู้เท่านั้น ค่า ณ รันไทม์

อะไรจะเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้ใน C ++? ประสิทธิภาพเป็นสิ่งสำคัญ แต่เหนือกว่าความปลอดภัย

Answers

ฉันจะอ่านสตริงรูปแบบของความยาวผันแปรใน C ++ จาก stdin ได้อย่างไร

คุณไม่ควรพยายามทำสิ่งนั้น เคยใช้สตริงรูปแบบคงที่เท่านั้น

ฉันต้องอ่านจาก stdin ก่อน int n กับขนาดของอาร์เรย์แล้วค่าจำนวนเต็ม

อะไรจะเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้ใน C ++?

อ่านทีละหนึ่งค่า ทำซ้ำโดยใช้การวนซ้ำ

นี่คือฟังก์ชันที่อธิบายข้อผิดพลาดของika:

const int SIZE = //as much of your memory as you'd like the user to have access to
***caller function must include this:
   //allocate a string to hold some data;
    char* buffer = NULL;
    buffer = malloc (SIZE * sizeof(char));
    if (buffer == NULL) {
        printf("malloc error terminating\n");
        return;
    }
***
void getEntry(char* buffer) {
    int count = 0;
    int maxlen = SIZE - 1;
    char a = '0';
    for (int i = 0; i < SIZE; i++) {
        buffer[i] = '0';
    }

    while (a != '\n' && count < maxlen) {
            a = fgetc(stdin);
            buffer[count] = a;
            count++;
    }
    if (a == '\n') {
        buffer[count - 1] = '\0';
    }
    else {
        buffer[count] = '\0';
        do {
                a = fgetc(stdin);
        } while (a != '\n');
    }
}

นี่คือรหัส C พื้นฐานทั้งหมด แต่การป้อนข้อมูลผู้ใช้นั้นไม่ดี นี่คือสิ่งที่ฉันได้มาสำหรับฟังก์ชั่นการป้อนข้อมูลผู้ใช้ C ++ ที่ใช้สำนวน (แบบสอบถามเป็นเพียงสตริงข้อความที่คุณส่งผ่าน):

template<typename T>
void getInput(const std::string query, T& entry) {
    std::string input;
    std::cout << query << std::endl;
    getline(std::cin, input);
    std::stringstream buffer{input};
    buffer >> entry;
}

หรือ

template<typename T>
void getInput2(std::string query, T& entry) {
    bool validInput = false;
    while (validInput == false)
    { 
        validInput = true;
        std::cout << query << std::endl;
        std::cin >> entry;
        if (std::cin.fail()) {
            validInput = false;
            std::cout << "Unacceptable entry\n" << std::endl;
        }
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}

Related