使用Unix输出的%,以及作为另一输出的奇怪字符。 C ++

时间:2014-01-13 20:48:19

标签: c++ unix character codelite

我目前有两个编码项目,这两个项目给我带来了一些我无法弄清楚的奇怪麻烦。我花了几个小时搞乱每件小事来尝试修复它们,它们似乎没有用完。

第一个是一个简单的程序,用于单步执行.txt文件并为字符赋值,并添加到打印的totalvalue。 'A' - 'Z'分别是值1-26,' - '是0和'。'也是0.示例.txt文件将是:

...............
..-............
.........A.....
..Z.........C..

这里的答案是30.最初我得到“30%”作为输出,并且在弄乱它以试图摆脱随机'%'时,我以某种方式搞砸了我的逻辑,现在它是只为每个文件输出“0%”。这是我的代码:

#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#include <vector>

using namespace std;

int getValue(char indicator)
{
    int value;
    if (indicator = 'A')
    {
        value = 1;
    }
    else if (indicator = 'B')
    {
        value = 2;
    }
    else if (indicator = 'C')
    {
        value = 3;
    }
    else if (indicator = 'D')
    {
        value = 4;
    }
    else if (indicator = 'E')
    {
        value = 5;
    }
    else if (indicator = 'F')
    {
        value = 6;
    }
    else if (indicator = 'G')
    {
        value = 7;
    }
    else if (indicator = 'H')
    {
        value = 8;
    }
    else if (indicator = 'I')
    {
        value = 9;
    }
    else if (indicator = 'J')
    {
        value = 10;
    }
    else if (indicator = 'K')
    {
        value = 11;
    }
    else if (indicator = 'L')
    {
        value = 12;
    }
    else if (indicator = 'M')
    {
        value = 13;
    }
    else if (indicator = 'N')
    {
        value = 14;
    }
    else if (indicator = 'O')
    {
        value = 15;
    }
    else if (indicator = 'P')
    {
        value = 16;
    }
    else if (indicator = 'Q')
    {
        value = 17;
    }
    else if (indicator = 'R')
    {
        value = 18;
    }
    else if (indicator = 'S')
    {
        value = 19;
    }
    else if (indicator = 'T')
    {
        value = 20;
    }
    else if (indicator = 'U')
    {
        value = 21;
    }
    else if (indicator = 'V')
    {
        value = 22;
    }
    else if (indicator = 'W')
    {
        value = 23;
    }
    else if (indicator = 'X')
    {
        value = 24;
    }
    else if (indicator = 'Y')
    {
        value = 25;
    }
    else if (indicator = 'Z')
    {
        value = 26;
    }
    return value;
}

int main()
{
    string filename;
    ifstream txtfile;
    char indicator;
    int currentvalue;
    int totalvalue = 0;
    cin >> filename;
    txtfile.open(filename.c_str());
    while(txtfile >> indicator)
    {
        if (indicator = '.')
        {
            currentvalue = 0;
        }
        else if (indicator = '-')
        {
            currentvalue = 0;
        }
        else
        {
            currentvalue = getValue(indicator);
        }
        totalvalue += currentvalue;
    }
    cout << totalvalue;
    return 0;
}

我的第二个问题可能有点复杂。该程序将十进制转换为二进制。我只允许自己创建函数并编辑dec2bin函数。其他一切都是禁区,包括int main()。代码中的注释都来自我的TA,以提供有关制作dec2bin函数的提示。我已经制作了指数函数,因为我们不允许添加任何额外的#includes。我将首先显示我的代码,然后显示输出的样子。

#include <iostream>
#include <string>

using namespace std;

bool isdecimal(string &input)
{
    // see bin2dec for description of how the below code works

    return input.find_first_not_of("0123456789") == string::npos;
}

void reverse(string &input) 
{
    int n = input.length();
    for (int k=0; k<n/2; k++) 
      swap(input[k], input[n-1-k]);
}

int exponential(int &exponent)
{
    int multiple = 1;
    for (int i = 0; i < exponent; i++)
    {
        multiple *= 10;
    }
    return multiple;
}

string dec2bin(string &decstr)
{
    // convert string decstr to integer decval:
    // 1) reverse to obtain LSB-MSB digit order
    reverse(decstr);
    // 2) for each ascii digit, subtract '0' to 
    //    obtain integer value, multiply by 10^k
    //    and continually add result to decval
    unsigned int i;
    int addval = 0;
    int remainder = 0;
    int decval = 0;
    int currentval = 0;
    char binchar;
    string newstring = "";
    for (i = 0; i < decstr.size(); i++)
    {
        currentval = (decstr[i] - '0');
        addval = currentval * exponential(i);
        decval += addval;
    }
    // apply successive-halving
    while(decval > 0) {
        remainder = decval % 2;
        decval = decval / 2;
        binchar = remainder;
        newstring.push_back(binchar);
    }
    // reverse to restore MSB-LSB bit order
    reverse(newstring);
    return newstring;
}

int main()
{
    string decstr;
    while (cin >> decstr) {
        if (isdecimal(decstr) == false)
            cout << "input error\n";
        else
            cout << dec2bin(decstr) << "\n";
    }
}

由于我不允许发布图片,我将描述我的输出是什么样的。无论我输入的是什么整数,它都返回一些空格和奇怪的方形笑脸的组合(我正在使用CodeLite,在Unix中它什么都不打印。)

提前感谢任何帮助我的人。我只是对此感到难过。此外,尽可能地模糊。只是一些指示可能有所帮助。我确定第一个是一些小的语法错误或类似的东西,但我根本找不到它。

2 个答案:

答案 0 :(得分:3)

为什么使用作业=运算符?

main.c

while(txtfile >> indicator)
{
  if (indicator = '.')
  {
     currentvalue = 0;
  }
  // SNIP!
}

当然你的意思是:

while(txtfile >> indicator)
{
  if (indicator == '.')
  {
     currentvalue = 0;
  }
  // SNIP!
}

===之间的巨大差异,一个是作业,另一个是内容的等式检查。

答案 1 :(得分:1)

解决了你的第一个问题,你分配指标而不是比较它,所以你总是得到0.还有,我整理了一下。

#include <iostream>
#include <fstream>

using namespace std;

int getValue(char indicator)
{
    int value = 0;
    switch(indicator)
    {
        case 'Z': value++;
        case 'Y': value++;
        case 'X': value++;
        case 'W': value++;
        case 'V': value++;
        case 'U': value++;
        case 'T': value++;
        case 'S': value++;
        case 'R': value++;
        case 'Q': value++;
        case 'P': value++;
        case 'O': value++;
        case 'N': value++;
        case 'M': value++;
        case 'L': value++;
        case 'K': value++;
        case 'J': value++;
        case 'I': value++;
        case 'H': value++;
        case 'G': value++;
        case 'F': value++;
        case 'E': value++;
        case 'D': value++;
        case 'C': value++;
        case 'B': value++;
        case 'A': value++;
                  break;
        default: value = 0;
    }
    return value;
}

int main()
{
    string      filename;
    ifstream    txtfile;
    char        indicator;
    int         currentvalue,
                totalvalue = 0;

    cin >> filename;
    txtfile.open(filename.c_str());

    while(txtfile >> indicator)
    {
        if (indicator == '.') // = is for assignment, == is for comparison
            currentvalue = 0;
        else if (indicator == '-')
            currentvalue = 0;
        else
            currentvalue = getValue(indicator);
        totalvalue += currentvalue;
    }
    cout << totalvalue << endl;
    return 0;
}

我的输入得到30分:)