首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对字符串使用char值?

如何对字符串使用char值?
EN

Stack Overflow用户
提问于 2019-04-21 04:39:26
回答 2查看 105关注 0票数 2

对不起,如果这是一个愚蠢的问题,这是我的第一节编码课。

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

示例运行应该如下所示:

代码语言:javascript
复制
Enter the first nine digits of the ISBN: 013601267
The ISBN-10 number is: 0136012671

我已经成功地制作了一个程序,它可以做到这一点,但对所有九个数字使用int值。不幸的是,这要求用户单独输入每个数字。

所以我现在要做的是使用一个string ISBN,这样我就可以针对各个部分,例如。isbn[0] * 1 + isbn[1] * 2...

我也尝试过static_cast<char>(ISBN[0]) * 1 + static_cast<char>....,认为它会做一些事情,我得到了同样的结果。

代码语言:javascript
复制
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值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-21 05:05:43

有四件事你应该检查:

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

代码语言:javascript
复制
if (ISBN.size() != 9) {
    // Error
}

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

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

代码语言:javascript
复制
n10 = ((ISBN[0] - '0') * 1) + ((ISBN[1] - '0') * 2) + ...

他说:但是你应该检查字符串都是数字。

代码语言:javascript
复制
for(auto x: ISBN) {
    if (!std::is_digit(x)) {
        // ERROR
    }
}

4:要打印带前导为零的9个字符的字符串,需要确保同步准备流:

代码语言:javascript
复制
std::cout << std::setw(9) << std::setfill('0') << number;

或者,如果数字已经以字符串形式存在,而您知道该字符串的长度为9个字符,则只需使用:

代码语言:javascript
复制
std::cout << ISBN;

因此,要输出正确的10个字符号,在您的情况下:

代码语言:javascript
复制
std::cout << ISBN << ((n10 == 10) ? 'X' : ('0' + n10)) << "\n";
票数 1
EN

Stack Overflow用户

发布于 2019-04-21 05:26:40

  1. 首先,应该检查字符串的大小。
代码语言:javascript
复制
if(ISBN.size() != 9){
    // ERROR
}
  1. 您可以使用for计算“n10”
代码语言:javascript
复制
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
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55779932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档