微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有人可以解释这个程序吗?我不明白

如何解决有人可以解释这个程序吗?我不明白

这是将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)。

因此,总的来说,这段代码基本上是将数字字符串转换为整数类型的函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。