问题描述
这是将ascii句子转换为字符句子的程序。但是我不理解 num = num * 10 +(str [i]-'0'); 为什么我们使用它以及为什么需要它?
#include <bits/stdc++.h>
using namespace std;
void asciiToSentence(string str,int len)
{
int num = 0;
for (int i = 0; i < len; i++) {
num = num * 10 + (str[i] - '0');
if (num >= 32 && num <= 122) {
char ch = (char)num;
cout << ch;
num = 0;
}
}
}
int main()
{
string str = "973265";
int len = str.length();
asciiToSentence(str,len);
return 0;
}
解决方法
首先,bits/*
不是标准头,您不应使用它们,否则您的代码可能无法使用MSVC等编译器进行编译。 Refer this.
现在让我们来查询:str[i] - '0'
只是将char
转换为相应的int
,即将'0'
转换为0
的一种方法。您可以在this thread上找到更多讨论。
您的代码做什么?
它只是继续从字符串中提取字符(循环),将其转换为int
,然后再乘以num
后再添加到10
中。这基本上是将一部分字符串"97"
转换为整数97
。
当num
的范围从32
(' '
)到122
('Z'
)(包括两者)时,它将它们强制转换为{{1 }}并打印出来。
示例输出说明:
您的代码将char
打印到控制台。如果可以弄清楚子字符串,将得到此结果。这里考虑这三个-a A
。然后"97" "32" "65"
将转换为"97"
(与97
一样,然后将其转换为int
并最终变为char
('a'
具有'a'
的ASCII值。同样,97
将是一个空格"32"
,而' '
将是"65"
。
这些子字符串不是由魔术来的。让我为您解释一个:
您有'A'
,str = "973265"
,然后循环开始:
num = 0
-> i = 0
-> str[i] = '9'
-> str[i] - '0' = 9
-> num是否在num = 0*10 + 9 = 9
范围内? [32,122]
->进行下一个迭代。
false
-> i = 1
-> str[i] = '7'
-> str[i] - '7' = 7
-> num是否在num = 9*10 + 7 = 97
范围内? [32,122]
-> true
->打印ch = (char)num = (char)97 = 'A'
,即ch
-> 'A'
->进行下一个迭代。
专业提示:使用调试器,设置断点,监视变量并逐步遍历代码,以便更好地理解。
请注意:当我写____时-我的意思是____这样____。
- “转换”-转换-
num = 0
或'0' <-> 0
- “广播”-强制转换-
"12" <-> 12
(假设您的编译器使用ASCII)。
在http://www.asciitable.com/中,您可以看到0
的ascii值为48,1
为49,2
为50,依此类推。
因此,如果str[i] - '0'
,str[i] == '0'
将给您0,如果str[i] == '1'
,则给您1,依此类推。这是将数字字符转换为其数学值的简单技巧。
我们将str[i] - '0'
称为x
,因此您不了解的行将变成num = num * 10 + x
。它的作用是,取原始的num
(假设它是32
),在其后添加一个0
(这样它就变成了320
),然后添加{{1} }(如果x
为7,则x
变成num
)。
因此,总的来说,这段代码基本上是将数字字符串转换为整数类型的函数。