如何解决字符数组的一部分?
我得到了一个任务,我在一个字符数组中接收婴儿的名字和体重(例如:Johnny,2 kg)。我必须将它们存储在一个最多可容纳 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,pos);
}
n++;
}
return n;
}
// int maxWeight(baby* baby_datapair){
// }
// int minWeight(baby* baby_datapair){
// }
// void descendingOrder(baby* baby_datapair,int num){
// }
解决方法
您必须使用 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,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){
// }
,
你拿错了尺寸。你不应该试图复制到,而只是复制自。顺便说一句,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...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。