如何将char值用于字符串?

时间:2019-04-21 04:39:27

标签: c++

抱歉,这是一个愚蠢的问题,这是我的第一个编码课程。

  

如果校验和为10,则根据   ISBN-10公约。编写一个程序,提示用户输入   前9位数字,并显示10位ISBN(包括前导   零)。您的程序应将输入读取为整数。

示例运行应如下所示:

Enter the first nine digits of the ISBN: 013601267
The ISBN-10 number is: 0136012671

我已经成功地制作了一个可以执行此操作的程序,但是所有9个数字都使用int值。不幸的是,这要求用户分别输入每个数字。

所以我现在要尝试的是使用string ISBN,以便我可以定位各个部分。 isbn[0] * 1 + isbn[1] * 2...

我也曾尝试static_cast<char>(ISBN[0]) * 1 + static_cast<char>....认为这样做会有所帮助,但得到的结果相同。

string ISBN;
cout << "Enter the first nine digits of the ISBN as integer: ";
cin>>ISBN;

int n10 = (ISBN[0] * 1 + ISBN[1] * 2 + ISBN[2] * 3 + ISBN[3] * 4 + ISBN[4] * 5 + ISBN[5] * 6 + ISBN[6] * 7 + ISBN[7] * 8 + ISBN[8] * 9) % 11;
if (n10 == 10)
{
    cout << ISBN << "X" << endl;
}
else
{
    cout << ISBN << n10 << endl;
}

因此,当我输入此数字013601267时,我应该在末尾得到一个1 (0136012671),而不是5 (0136012675)

我认为这是因为它给了我ASCII十进制值而不是char值。

2 个答案:

答案 0 :(得分:1)

您应该检查的四件事:

1:字符串的大小实际上是9个字符。

if (ISBN.size() != 9) {
    // Error
}

否则,访问不存在的元素将导致程序错误。

2:数字不是从值0开始。在ASCII(或UTF-8)中,数字从48开始。因此48 =>'0'49 =>'1'等等。但是C ++保证所有数字都是连续的,只要您知道第一个数字就可以减去并获得正确的值。如果在整数表达式中使用'0',它将转换为正确的值。因此,要从char生成数字值,您应该在相乘之前从每个数字中减去该值。

n10 = ((ISBN[0] - '0') * 1) + ((ISBN[1] - '0') * 2) + ...

3:但是您应该检查字符串是否为全数字。

for(auto x: ISBN) {
    if (!std::is_digit(x)) {
        // ERROR
    }
}

4:要打印以零开头的9个字符的字符串,您需要确保完全准备好流:

std::cout << std::setw(9) << std::setfill('0') << number;

或者如果该数字已经是您知道的9个字符长的字符串形式,则可以简单地使用:

std::cout << ISBN;

要在您的情况下输出正确的10个字符,请执行以下操作:

std::cout << ISBN << ((n10 == 10) ? 'X' : ('0' + n10)) << "\n";

答案 1 :(得分:0)

  1. 首先,您应该检查字符串的大小
if(ISBN.size() != 9){
    // ERROR
}
  1. 您可以使用for计算'n10'
int n10 = 0;
for(int i = 0; i < ISBN.size(); ++i){
    if(std::is_digit(x)){    // check digit
        // characters '0','1','2'... are not same as digits 0, 1, 2...
        // the value of '0' is 48, as shown here [ascii table][1] 
        n10 = (ISBN[i] - '0') * (i+1) + n10;
    } else {
        // ERROR
    }
}