如何解决如何在一个函数中使用传递给指针的信息,并在另一个函数中输出信息?
NA
我希望能够将输入到rentArray中的数字输入到enterRents函数中,并将其全部输出到displayRents函数中。但是在行上“ cout
解决方法
您显示的代码中存在许多问题。
-
int rentArray[7];
是一个局部变量,函数返回时将销毁该局部变量。当函数返回时,您设置为指向该变量的任何指针都将无效,而取消引用它们将导致未定义行为。 -
for (size; size < 7; size++)
没有任何意义。size
由调用函数提供,不应更改。另外,size
不会执行任何操作,因此如果调用函数提供了size < 7
,则false
将是7
。 - 如果
cin >> rentArray[i];
失败,它将rentArray[i]
保留为未初始化状态,以后再读取它也会导致不确定的行为。
这是替代方法:
#include <cstddef> // std::size_t
#include <iostream>
#include <vector> // std::size
// return the number of successfully extracted rents:
size_t enterRents(int* rent,const size_t size) {
for(size_t i = 0; i < size; ++i) {
std::cout << "Enter Rent Amount " << (i + 1) << ": ";
if(!(std::cin >> rent[i])) return i; // check that extraction succeeded
}
return size;
}
void displayRents(const int* rent,const size_t size) {
std::cout << "Rents:\n";
for(size_t i = 0; i < size; i++) {
std::cout << "$" << rent[i] << '\n';
}
}
int main() {
int rentArray[7];
size_t size = enterRents(rentArray,std::size(rentArray));
std::cout << "You entered " << size << " rent(s).\n";
displayRents(rentArray,size);
}
然而,标准库中有一个容器非常适合:std::vector
。如果改写成使用它:
#include <cstddef> // size_t
#include <iostream>
#include <vector> // std::vector
void enterRents(std::vector<int>& rent,const size_t max_rents) {
int temp;
for(size_t i = 0; i < max_rents; ++i) {
std::cout << "Enter Rent Amount " << (i + 1) << ": ";
if(!(std::cin >> temp)) return;
rent.push_back(temp);
}
}
void displayRents(const std::vector<int>& rent) {
std::cout << "Rents:\n";
for(int value : rent) {
std::cout << "$" << value << '\n';
}
}
int main() {
std::vector<int> rentArray;
enterRents(rentArray,7);
std::cout << "You entered " << rentArray.size() << " rent(s).\n";
displayRents(rentArray);
}
或者让enterRents
创建std::vector<int>
并按值返回:
#include <cstddef>
#include <iostream>
#include <vector>
std::vector<int> enterRents(const size_t max_rents) {
std::vector<int> rent;
rent.reserve(max_rents);
int temp;
for(size_t i = 0; i < max_rents; ++i) {
std::cout << "Enter Rent Amount " << (i + 1) << ": ";
if(!(std::cin >> temp)) break;
rent.push_back(temp);
}
return rent;
}
void displayRents(const std::vector<int>& rent) {
std::cout << "Rents:\n";
for(int value : rent) {
std::cout << "$" << value << '\n';
}
}
int main() {
std::vector<int> rentArray = enterRents(7);
std::cout << "You entered " << rentArray.size() << " rent(s).\n";
displayRents(rentArray);
}
,
让我们看看是否可以帮您解决问题。浏览完函数后,似乎对如何处理函数外部的rent
的声明存储以及如何将指向rent
的指针作为参数传递并更新每个函数的值感到困惑函数中rent
的元素,并在调用函数中提供更改。
考虑您所需要的代码逻辑。您需要:
- 一个常量,用于定义
rent
中有多少个元素, - 您需要
rent
的整数值数组,最后是 - 您需要一个计数器来保存用户输入的租金数量(用户输入的数量可能少于您要求的数量)
现在要为rent
存储。虽然您应该使用std::vector并传递对向量的引用(毕竟这是C ++),但是了解处理POA(普通旧数组)类型和指针具有教育意义。我怀疑这就是您正在从事的工作。
在开始分配值之前,必须具有有效的存储空间才能将其放入。声明数组时,需要在程序(或函数)堆栈上为该数组创建存储。该存储在该函数的生命期内有效,您可以随意将指针传递给该数组,并根据需要填充元素。如果您在main()
中声明了数组,则存储将在程序有效期内保持有效(直到从main()
返回)。
您的计数器可以在main()
中声明为简单整数,并且它在程序堆栈上也保留有存储。同样,您可以将指针传递到enterRents()
函数的计数器,并为函数内原始变量的地址更新值。例如,根据您的情况,您可以编写一个简短的main()
来完成该操作:
#define ARRSZ 7
...
int main (void) {
int rent[ARRSZ],/* array of rents */
size = 0; /* number of rents entered */
enterRents (rent,&size); /* get the rents */
...
在这里声明数组和计数器size
,并将指向rent
中第一个元素的指针和指向size
的指针作为enterRents()
的参数传递。 (在访问时,数组会自动转换为指向第一个元素的指针)
因此,现在,如果对于enterRents()
中输入的每个成功值,size
更新了1
地址中存储的值,您便可以验证输入了多少租金因此即使您输入的租金少于ARRSZ
,您也可以输出用户输入的租金。您完整的main()
将是:
int main (void) {
int rent[ARRSZ],/* array of rents */
size = 0; /* numer of rents entered */
enterRents (rent,&size); /* get the rents */
if (size > 0) /* validate at least 1 rent entered */
displayRents (rent,size); /* display rents */
else /* otherwise none entered */
std::cerr << "No rents entered.\n";
}
(注意:,如果用户输入的租金少于ARRSZ
,并且通过生成手册EOF
终止输入,则您不会调用未定义的行为( Ctrl + d 或在Windows Ctrl + z )上)
现在查看enterRents()
,您将需要连续循环,直到用户输入ARRSZ
租金或发生不可恢复的流错误或用户生成手册EOF
。您可以通过检查输入之后的流状态来验证每个输入。请参见std::basic_istream(成员函数)。如果用户输入"cow"
而不是有效的整数,则可以通过检查std::cin.fail()
来处理这种情况,并且需要.clear()
发生流错误,然后在尝试下一个输入之前清空stdin
中所有有问题的字符。 (您可以使用.ignore()
来做到)
您的enterRents()
可能是:
#include <iostream>
#include <limits>
#define ARRSZ 7
void enterRents(int *rent,int *size)
{
std::cout << "Enter rents for " << ARRSZ << " properties\n\n";
while (*size < ARRSZ) /* loop until ARRSZ rents entered or EOF or error */
{
int amount; /* temporary int to store input */
std::cout << "Property " << *size + 1 << " Rent Amount: ";
if (std::cin >> amount) { /* read input / validate */
rent[*size] = amount; /* store amount at *size offset in rent */
(*size)++; /* increment value at address */
}
/* check unrecoverable error or manual EOF */
else if (std::cin.bad() || std::cin.eof()) {
std::cerr << "\nstream error or manual EOF\n";
return;
}
/* check if non-integer input given */
else if (std::cin.fail()) {
char badinput[1024];
std::cin.clear(); /* clear stream error */
if (std::cin >> badinput)
std::cerr << "error: invalid integer input '" << badinput << "'\n";
/* discard offending characters left in stdin */
std::cin.ignore (std::numeric_limits<std::streamsize>::max(),'\n');
}
}
}
最后,您的displayRents()
仅需要将数组作为参数,并且复制size
就可以了(您无需在显示函数中更新该地址的值)
void displayRents(int *rent,int size)
{
std::cout << "\nRents:\n";
for (int i = 0; i < size; i++)
std::cout << "$" << rent[i] << '\n';
}
将其完全放进去:
#include <iostream>
#include <limits>
#define ARRSZ 7
void enterRents(int *rent,'\n');
}
}
}
void displayRents(int *rent,int size)
{
std::cout << "\nRents:\n";
for (int i = 0; i < size; i++)
std::cout << "$" << rent[i] << '\n';
}
int main (void) {
int rent[ARRSZ],size); /* display rents */
else /* otherwise none entered */
std::cerr << "No rents entered.\n";
}
使用/输出示例
$ ./bin/rents
Enter rents for 7 properties
Property 1 Rent Amount: 585
Property 2 Rent Amount: 640
Property 3 Rent Amount: 935
Property 4 Rent Amount: 400
Property 5 Rent Amount: 655
Property 6 Rent Amount: 495
Property 7 Rent Amount: 700
Rents:
$585
$640
$935
$400
$655
$495
$700
或者在少于所有输入的情况下:
$ ./bin/rents
Enter rents for 7 properties
Property 1 Rent Amount: 585
Property 2 Rent Amount: 640
Property 3 Rent Amount: Mickey Mouse
error: invalid integer input 'Mickey'
Property 3 Rent Amount: 935
Property 4 Rent Amount:
stream error or manual EOF
Rents:
$585
$640
$935
或者对于EOF
,在输入任何租金之前:
$ ./bin/rents
Enter rents for 7 properties
Property 1 Rent Amount:
stream error or manual EOF
No rents entered.
关键是 验证,验证,验证 ,以便无论疯狂的用户输入是什么,您的程序都可以正常处理它。仔细研究一下,如果您还有其他问题,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。