#include <iostream>
#include <cctype> // isdigit
using namespace std;
// Global buffer
const int LINE_LENGTH = 128;
char line[LINE_LENGTH];
int lineIndex;
void getLine () {
// Get a line of characters.
// Install a newline character as sentinel.
cin.getline (line, LINE_LENGTH);
line[cin.gcount () - 1] = '\n';
lineIndex = 0;
}
enum State {eI, eF, eM, eSTOP};
void parseNum (bool& v, int& n) {
int sign;
State state;
char nextChar;
v = true;
state = eI;
do {
nextChar = line[lineIndex++];
switch (state) {
case eI:
if (nextChar == '+') {
sign = +1;
state = eF;
}
else if (nextChar == '-') {
sign = -1;
state = eF;
}
else if (isdigit (nextChar)) {
sign = +1;
n = nextChar - '0'; // line 41
state = eM;
}
else {
v = false;
}
break;
case eF:
if (isdigit (nextChar)) {
n = nextChar - '0';
state = eM;
}
else {
v = false;
}
break;
case eM:
if (isdigit (nextChar)) {
n = 10 * n + nextChar - '0';
}
else if (nextChar == '\n') {
n = sign * n;
state = eSTOP;
}
else {
v = false;
}
break;
}
}
while ((state != eSTOP) && v);
}
int main () {
bool valid;
int num;
cout << "Enter number: ";
getLine();
parseNum (valid, num);
if (valid) {
cout << "Number = " << num << endl;
}
else {
cout << "Invalid entry." << endl;
}
return 0;
}
第41行的'0'是什么意思?这行是否指定下一个字符减去nextChar的第一个字符?
答案 0 :(得分:7)
nextChar - '0'
返回字符的整数值。例如,如果字符值为'1'(即ASCII 0x31),那么如果减去'0'(即0x30),则得到值1.由于ASCII值'0' - '9'是连续的,因此技术将起作用。
答案 1 :(得分:5)
它将nextChar中引用的数字(以ASCII格式)转换为实际值。因此,如果ASCII值为'5',则从'5'减去'0'会得到数值5。
此转换允许您对通过键盘输入的值执行数学运算。
答案 2 :(得分:3)
将来,请将您的示例剥离到最少量的代码,以充分地提出您的问题。
'0'与0的不同之处在于'0'是ASCII,0是,0。 看看ASCII standard。字符“0”是值48。 这条线
n = nextChar - '0';
可以很容易地写成
n = nextChar - 48
该行正在进行某种将数字的ASCII表示转换为实际的整数表示。
答案 3 :(得分:2)
它从对应于数字的ASCII码转换为数字本身。
因此它会占用角色'1'
,并为您提供数字1
。等等其他数字。
答案 4 :(得分:1)
'0'返回0字符的ascii代码(即48)。它允许在数值(例如7)和它的ascii eqvivalent(55,如你所见here)之间进行简单的转换:7 +'0'= 7 + 48 = 55
答案 5 :(得分:1)
假设c是'0'和'9'之间的char
根据定义,字符很小 整数,所以char变量和 常数与ints相同 算术表达式。这是 自然方便;例如 c-'0'是一个带有的整数表达式 对应于0到9之间的值 字符'0'到'9'存储在c中。 Kernighan and Ritchie