给出奇怪值的字符串

Strings giving weird values

本文关键字:字符串      更新时间:2023-10-16

我必须得到一串用空格分隔的 2 位数字,以某种方式取出数字并对其进行操作。但是价值观都出错了,你自己看看:

...
string = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08"; //example
for (int i = 0; i < string.size()-2; i += 3){
arr[i] = 10 * string[i] + string[i+1];      
cout << arr[i] <<' '<< 10 * string[i] <<' '<< string[i] << string[i+1] <<endl;
}

output:
536 480 08  i guess 0 times 10 isn't 480 as well as that plus 8 equals 536
530 480 02
550 500 22
625 570 97
566 510 38
543 490 15
528 480 00
568 520 40
528 480 00
603 550 75
532 480 04
533 480 05
535 480 07
606 550 78
580 530 52
540 490 12
578 530 50
605 550 77
619 570 91
536 480 08

您正在使用字符的 ASCII 值而不是数字的数值进行计算。 例如 '0'是 48,'1'是 49,依此类推。

for (int i = 0; i < string.size()-2; i += 3){
    arr[i] = 10 * (string[i]-'0') + (string[i+1]-'0');      
    cout << arr[i] <<' '<< 10 * string[i] <<' '<< string[i] << string[i+1] <<endl;
}

您误解了要检索的 int 值。举个例子,你拉08

'0'不是0,而是48
'8'不是8,而是56

48 * 10 + 56 = 536

不要采用字符的 ASCII 表示形式并在计算中使用它,而是使用 atoi。

此外,您可能希望研究在C++中拆分文本字符串的多种方法,而不是逐个字符。

将字符转换为整数会为您提供表示该字符的数值;对于数字,该值与数字的值不同。如今,您会发现几乎每台计算机都使用 ASCII 编码,其中'0'用值 48 表示,'1'用值 49 表示,依此类推。

您希望减去表示'0'的值,以便'0'变为 0,'1'变为 1,依此类推:

arr[i] = 10 * (string[i] - '0') + (string[i+1] - '0');

您可以使用 stoi()(字符串转换为整数)将字符串转换为数值,然后执行操作。