如何在一个函数中使用传递给指针的信息,并在另一个函数中输出信息?

如何解决如何在一个函数中使用传递给指针的信息,并在另一个函数中输出信息?

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的元素,并在调用函数中提供更改。

考虑您所需要的代码逻辑。您需要:

  1. 一个常量,用于定义rent中有多少个元素,
  2. 您需要rent的整数值数组,最后是
  3. 您需要一个计数器来保存用户输入的租金数量(用户输入的数量可能少于您要求的数量)

现在要为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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res