繁体   English   中英

我正在尝试向我的堆栈中输入一个值,但它给了我一个错误

[英]I am trying to input a value into my stack but it gives me an error

因为当我将数字 2 输入我的变量时,它告诉我它没有定义? 有帮助吗?

int plusThree(){

input 2 -> stack;

return stack;

}

继续我的评论,跳出的第一个问题是您将int large1, int large2声明为twoLargest()的参数。 当您在参数列表中放置变量(不是引用也不是指针)时,function 会收到驻留在函数堆栈上的变量的本地副本,并且当 function 返回并返回时,您对本地副本所做的任何更改都将丢失堆栈被销毁(例如函数堆栈 memory 被释放以供重新使用)

在 C++ 中,您可以将引用作为参数传递,从而允许 function 对来自调用 function 的实际变量进行操作,而不是对副本进行操作。 因此,您想要引用large1large2 ,而不是int large1, int large2 ,例如int& large1, int& large2

跳出的下一个错误是您尝试将arraymain()作为int arr[]传递给您的 function。 main()中声明std::vector<int> array; ,所以array的类型是std::vector<int> ,而不是int[] (这需要一个大小不是不完整的类型)您还想将array作为参考传递,以避免为 function 制作array的完整副本 - 并且 - 因为array在您的 function 中没有更改,您应该将引用声明为const告诉编译器它不会在 function 中更改,这允许编译器进一步优化其使用。

总而言之,将 function 类型更改为void因为它不返回任何值并修复语法和符号问题并正确初始化为类型范围中的最低值,因为您正在寻找max ,您将拥有:

/* type of function is 'void' it does not return a value.
 * by passing references to large1 and large2 the function
 * will operate on the variable passed from main() instead
 * of local "copies" of the variables.
 */ 
void twoLargest(const std::vector<int>& arr, int& large1, int& large2)
{
    /* always initialize max variables to min of range to start */
    large1 = std::numeric_limits<int>::min();
    large2 = std::numeric_limits<int>::min();
    
    for (size_t i = 0; i < arr.size(); i++) {
        if (arr[i] > large1) {
            large2 = large1;
            large1 = arr[i];
        }
        else if (arr[i] > large2) {
            large2 = arr[i];
        }
    }
}

注意:如果值都是负数,将large1large2初始化为0将不起作用。您还需要为类型的max()min() #include <limits> 。)

为了传递large1large2作为对twoLargest()的引用,您传递的int变量必须在调用 function(此处为main() )中声明。 因此,您需要在要传递的main()中声明两个int变量,例如int l1, l2即可。 然后你将你的 function 称为:

    twoLargest (array, l1, l2);   /* call function and output results */

其他大问题,如果用户输入 integer 值时出错,您的程序将出现未定义行为 您必须验证每个用户输入。 为此,您在每次输入之后和尝试使用由输入填充的变量之前检查std::cin的流状态。 它可以是一个简单的:

if (!(std::cin >> sizeArray)) {
    std::cerr << "error: invalid integer input.\n";
    return 1;
}

如果用户提供了无效的sizeArray输入,您只需退出程序。 或者,您可以进行完整的错误检测和恢复,例如在何处取值来填充数组。 在这种情况下,要处理任何非整数输入,您需要检查.eof().bad()的流状态标志(它们是不可恢复的错误)和.fail()指示非整数输入,这您可以通过清除failbit并从stdin中删除未读字符来更正,然后再允许用户重试。 你可以这样做类似于:

    for (; i < sizeArray;) {   /* only increment on valid input */
        int n;
        std::cout << "array[" << i << "]: ";
        
        if (!(std::cin >> n)) {
            /* if eof() or bad() break read loop */
            if (std::cin.eof() || std::cin.bad()) {
                std::cerr << "(user canceled or unreconverable error)\n";
                return 1;
            }
            else if (std::cin.fail()) {     /* if failbit */
                std::cerr << "error: invalid integer input.\n";
                std::cin.clear();           /* clear failbit */
                /* extract any characters that remain unread */
                std::cin.ignore (std::numeric_limits<std::streamsize>::max(),
                                 '\n');
            }
        }
        else {  /* only on good input */
            array.push_back(n);
            i += 1;                         /* increment loop counter */
        }
    }

注意: i是在进入循环之前声明的,因为它在我的示例中用于多种目的)

如果你把它们放在一起,你可以有一个例子来找到两个最大的,看起来像这样:

#include <iostream>
#include <vector>
#include <limits>

/* type of function is 'void' it does not return a value.
 * by passing references to large1 and large2 the function
 * will operate on the variable passed from main() instead
 * of local "copies" of the variables.
 */ 
void twoLargest(const std::vector<int>& arr, int& large1, int& large2)
{
    /* always initialize max variables to min of range to start */
    large1 = std::numeric_limits<int>::min();
    large2 = std::numeric_limits<int>::min();
    
    for (size_t i = 0; i < arr.size(); i++) {
        if (arr[i] > large1) {
            large2 = large1;
            large1 = arr[i];
        }
        else if (arr[i] > large2) {
            large2 = arr[i];
        }
    }
}

int main() {
    
    std::cout << "How large would you like the array to be?: ";
    int l1, l2, sizeArray, i = 0;   /* declare vars for large1/2 in main */
    /* validate EVERY user-input */
    if (!(std::cin >> sizeArray)) {
        std::cerr << "error: invalid integer input.\n";
        return 1;
    }
    
    std::vector<int> array;
    for (; i < sizeArray;) {   /* only increment on valid input */
        int n;
        std::cout << "array[" << i << "]: ";
        
        if (!(std::cin >> n)) {
            /* if eof() or bad() break read loop */
            if (std::cin.eof() || std::cin.bad()) {
                std::cerr << "(user canceled or unreconverable error)\n";
                return 1;
            }
            else if (std::cin.fail()) {     /* if failbit */
                std::cerr << "error: invalid integer input.\n";
                std::cin.clear();           /* clear failbit */
                /* extract any characters that remain unread */
                std::cin.ignore (std::numeric_limits<std::streamsize>::max(),
                                 '\n');
            }
        }
        else {  /* only on good input */
            array.push_back(n);
            i += 1;                         /* increment loop counter */
        }
    }
    
    i = 0;  /* flag controlling comma output */
    std::cout << "\nstd::vector<int>: ";
    for (const auto& n : array) {
        if (i) {
            std::cout.put(',');
        }
        std::cout << n;
        i = 1;
    }
    std::cout.put('\n');
    
    twoLargest (array, l1, l2);   /* call function and output results */
    
    std::cout << "\nresult twoLargest(): " << l1 << ", " << l2 << '\n';
}

示例使用/输出

$ ./bin/twoLargest
How large would you like the array to be?: 5
array[0]: foo
error: invalid integer input.
array[0]: 2
array[1]: 9
array[2]: 3
array[3]: Seven, I want to enter 7!
error: invalid integer input.
array[3]: 7
array[4]: 4

std::vector<int>: 2,9,3,7,4

result twoLargest(): 9, 7

我在评论中提到了一些其他提示。 除了更正参数错误之外,最重要的是您需要验证每个用户输入。 在你编写了一个输入例程后,go 尝试并故意破坏它(用户会错误地输入错误的输入并故意在你的代码中寻找漏洞)。 如果您的输入例程在测试时中断——go 修复它并重试,直到您对它满意为止。

检查一下,如果您还有其他问题,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM