首页 > 解决方案 > 如何在每次循环迭代期间清除字符串中的值?

问题描述

我想将不同的 b 值附加到我的原始数字,但在循环的一次迭代后(每次 cout 之后)将原始 num 值和 decVal 值刷新回空字符串和 0。我该怎么做?例如,我没有返回 001 = 1, 011 = 3,而是得到 001 = 1, 001011 = 4。

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

void main()
{
    int n, decVal;
    int i = 7;
    string num, b, originalnum; 
    cin >> n;
    for (x = 0; x < n; ++i)
    {
        cin >> num;
        cin.get(b);
        cin.ignore();
        originalnum += b;
        decVal += atoi(&b) * pow(2, i);
        i -= 1;
        cout << "The decimal equivalent of " << originalnum << " = " << decVal << endl;
    }
}

标签: c++

解决方案


如果我理解您的要求,您希望能够重复输入位数并输出包含位表示和十进制值的字符串。您希望在不同的迭代之间重置所有变量decVal。为了使这成为可能,除了修复一些错误,您只需将当前正在执行的操作包装在另一个循环中,以便对于外部循环的每次迭代,您都可以处理您喜欢的所有位,并得出最终decVal输出.

在查看解决方案之前,如上面评论中所述,void main()仅对独立环境有效(例如,没有操作系统,如微控制器等)。否则,允许的mainfor 声明是int main (void)and int main (int argc, char *argv[])(您将看到用等价的char **argv)。请参阅C 和 C++ 中 main() 应该返回什么?

虽然方便,但您还需要阅读为什么“使用命名空间 std;” 被认为是不好的做法?'\n'这样你就明白了and之间的区别了std::endl,继续看看C++:“std::endl” vs “\n”</a>

对于每个输入,您必须始终做的一件事是通过在尝试输入之后和在使用输入填充的变量之前检查流状态来验证它是否成功。如果发生匹配失败,failbit将被设置并且您必须在尝试下一次输入之前清除错误位。您可以以任何您喜欢的方式处理错误,从结束程序,或通过清除错误位并删除导致问题的字符.ignore()(两者的示例如下所示)。本质上,您至少需要以下内容:

        if (!(std::cin >> n)) {             /* validate EVERY user input */
            std::cerr << "invalid unsigned input -- exiting.\n";
            return 1;
        }

注意:您应该使用其完整且正确的调用来删除任何特定情况下的最大数量的值,而不仅仅是调用.ignore()。从文件流中读取时,即std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');:)

现在对于您的程序设置,您基本上可以只使用类似于您所拥有的代码的连续循环,并且只需提供一种机制来在用户完成输入值时退出外部循环。例如,使用一个简单的while(1)循环并让用户输入除有效数字之外的任何内容 for n,您可以执行以下操作:

    while (1) {                             /* outer loop - loop continually */
        size_t n;                           /* declare variables within loop */
        uint32_t decVal = 0;
        std::string originalnum {}; 
        
        std::cout << "\nenter no. of bits ('q' to quit): ";
        if (!(std::cin >> n)) {             /* validate EVERY user input */
            std::cerr << "invalid unsigned input -- exiting.\n";
            return 1;
        }

注意:所有变量都在循环内声明,因此对于每次迭代,每次都声明和初始化变量。上面的用户被告知按下'q'退出 - 但可以输入任何不是有效数字的内容以退出。这将简单地退出程序,将控制权返回给调用进程。

pow()查看您的代码,该函数确实不需要decVal根据用户输入的0's 和1's 进行计算。相反,您可以简单地声明decVal为一个unsigned值(下面使用精确的 with uint32_t)并简单地使用Left-Shift将每个输入移动当前循环计数器的位数。

使用上述左移进行计算decVal(确保decVal在声明时初始化为零),并将用户输入添加到字符串的前面以保留 LSB 一阶,您可以执行以下操作:

#include <iostream>
#include <iomanip>
#include <string>
#include <limits>
#include <climits>

int main (void)
{
    while (1) {                             /* outer loop - loop continually */
        size_t n;                           /* declare variables within loop */
        uint32_t decVal = 0;
        std::string originalnum {}; 
        
        std::cout << "\nenter no. of bits ('q' to quit): ";
        if (!(std::cin >> n)) {             /* validate EVERY user input */
            std::cerr << "invalid unsigned input -- exiting.\n";
            return 1;
        }
        if (n > sizeof (uint32_t) * CHAR_BIT) { /* validate EVERY value in range */
            std::cerr << "  error: n exceeds no. of bits avaialble.\n";
            return 1;
        }
        
        for (size_t i = 0; i < n;) {        /* inner loop, process bits */
            uint32_t bit;
            std::cout << " bit" << std::setw(2) << i << ": ";
            if (!(std::cin >> bit) || bit > 1) {
                std::cerr << "  error: invalid bit input.\n";
                std::cin.clear();
                std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
                continue;
            }
            decVal += bit << i;                     /* no need for pow(), left-shift */
            originalnum.insert(0, 1, bit + '0');    /* build originalnum each iteration */
            i++;                                    /* increemnt on good input */
        }
        /* result */
        std:: cout << "The decimal equivalent of " << originalnum << 
                        " = " << decVal << '\n';
    }
}

注意: 数字限制——cppreference.com显示每个使用的限制所需的头文件)

示例使用/输出

以下是与您显示的内容类似的输入和输出,但添加了提示以指导用户,并实施了错误处理以确保仅将有效0的 ' 和1' 作为输入:

$ ./bin/decval

enter no. of bits ('q' to quit): 3
 bit 0: 1
 bit 1: 1
 bit 2: 0
The decimal equivalent of 011 = 3

enter no. of bits ('q' to quit): 3
 bit 0: 1
 bit 1: 0
 bit 2: 0
The decimal equivalent of 001 = 1

enter no. of bits ('q' to quit): 3
 bit 0: 1
 bit 1: 0
 bit 2: pickles
  error: invalid bit input.
 bit 2: 1
The decimal equivalent of 101 = 5

enter no. of bits ('q' to quit): q
invalid unsigned input -- exiting.

如果您还有其他问题或我误解了您的意图,请仔细查看并告诉我。


推荐阅读