【问题标题】:Part of the char array?字符数组的一部分?
【发布时间】:2021-06-13 18:19:05
【问题描述】:

我有一个任务,我在字符数组中接收婴儿的名字和体重(例如:Johnny,2 公斤)。我必须将它们存储在一个最多可以容纳 1000 个元素的数组中,并且必须是一个结构类型,存储婴儿的名字和体重。

每个动作都必须在函数中完成 - 但是,当我试图在逗号之前获取名称时,str.copy() 对我不起作用。它的具体问题是最后一个参数,即位置。有人可以帮我解决这个问题吗?另外,我对 C++ 有点陌生,并想象如何在两个函数中分别在 char 数组中询问直到空行并在另一个函数中进行复制...如果有人可以帮助我,我将不胜感激^^'

提前感谢您的帮助!

#include<iostream>
#include<string>

#define M 1000

struct baby{
    std::string baby_name;
    float weight;
    
};

int readIn(baby* baby_datapair, int max);
// int maxWeight(baby* baby_datapair);
// int minWeight(baby* baby_datapair);
// void descendingOrder(baby* baby_datapair, int num);

int main(){
    
    baby baby_array[M];
    int n = readIn(baby_array, M);
    
    
    return 0;
}

int readIn(baby* baby_datapair, int max){
    
    int n = 0;
    char name[12];
    while (n < max){
        std::cout << "Baby" << n+1 << "'s datas (Nickname, weight in kg): ";
        std::getline(std::cin, name);
        //~ std::cin.ignore(1);
        if (neve == ""){
            std::cout << "Wrong input!\n";
            break;
        }else{
            std::size_t pos = name.find(',');
            std::size_t until = name.copy(baby_datapair[n].baby_name, 0, pos);
            
        }
        n++;

    }
        
    return n;
}

// int maxWeight(baby* baby_datapair){
    
// }

// int minWeight(baby* baby_datapair){
    
// }

// void descendingOrder(baby* baby_datapair, int num){
    
    
// }

【问题讨论】:

  • 请制作一个可重复性最低的示例。不过最好同时具备两者,首先是有关问题起源的一些背景知识,然后是一个可重复性最低的示例。

标签: c++ arrays struct char


【解决方案1】:

您必须使用std::string name; 而不是char name[12]; 作为 std::getline 的参数。顺便说一句,它使内存管理更好。输入数据后,检查pos值是否有效。

#include<iostream>
#include<string>

#define M 1000

struct baby {
    std::string baby_name;
    float weight;

};

int readIn(baby* baby_datapair, int max);
// int maxWeight(baby* baby_datapair);
// int minWeight(baby* baby_datapair);
// void descendingOrder(baby* baby_datapair, int num);

int main() {

    baby baby_array[M];
    int n = readIn(baby_array, M);


    return 0;
}

int readIn(baby* baby_datapair, int max) {

    int n = 0;
    //char name[12];
    std::string name;
    while (n < max) {
        std::cout << "Baby" << n + 1 << "'s datas (Nickname, weight in kg): ";
        std::getline(std::cin, name);
        //~ std::cin.ignore(1);
        if (name == "") {
            std::cout << "Wrong input!\n";
            break;
        }
        else {
            std::size_t pos = name.find(',');
            if (pos <= 0) {
                std::cout << "Invalid input structure!\n";
                continue;
            }
            //std::size_t until = name.copy(baby_datapair[n].baby_name, 0, pos);
            baby_datapair[n].baby_name = name.substr(0, pos);
            baby_datapair[n].weight =(float)atof(name.substr(pos+1).c_str());

            //std::cout << std::endl;
            //std::cout << baby_datapair[n].baby_name;
            //std::cout << ", " << baby_datapair[n].weight;
        }
        n++;

    }

    return n;
}

// int maxWeight(baby* baby_datapair){

// }

// int minWeight(baby* baby_datapair){

// }

// void descendingOrder(baby* baby_datapair, int num){


// }

【讨论】:

    【解决方案2】:

    你拿错了尺寸。您不应该尝试复制到,而只是复制自。顺便说一句,name 必须是 std::string 才能让您的程序编译,并且您应该检查可能的文件结尾。所以一个最小固定的版本可能是:

    std::string name;
    while (n < max) {
        std::cout << "Baby" << n + 1 << "'s datas (Nickname, weight in kg): ";
        std::getline(std::cin, name);
        //~ std::cin.ignore(1);
        if ((! std::cin) || name == "") {
            std::cout << "Wrong input!\n";
            break;
        }
        else {
            std::size_t pos = name.find(',');
            baby_datapair[n].baby_name = std::string(name.c_str(), pos);
            baby_datapair[n].weight = strtof(name.c_str() + pos + 1, nullptr);
    
        }
    

    但是在 C++ 中使用 std::stringstream 会更惯用。上面的代码相当 C-ish...

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 1970-01-01
      • 2012-12-31
      • 2023-03-16
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      相关资源
      最近更新 更多