官方题解 | #实现简单计算器功能#
实现简单计算器功能
http://www.nowcoder.com/practice/e7c08272a4b7497fb990ce7abb1ee952
预备知识
- 字符串相关函数
- int atoi(const char * nptr); 将整数字符串转换成 int 类型的整数
- char strtok(char str, const char * delim); 将字符串按照 delim 中的字符进行分割。当 strtok() 在参数 str 的字符串中发现参数 delim 分割字符时,则会将该字符改为 \0 字符,当连续出现多个时只替换第一个为 \0。在第一次调用时,strtok() 必须给与参数 str 字符串,往后调用则将参数 str 设置为 空指针,每次调用成功则返回指向被分割出片段的指针。
- int strcmp(const char s1, const char s2); 比较 s1 和 s2 的大小,比较的是字符 ASCII 码大小,返回值为 0 表示相等。
- int strcmp(char s1, char s2); 比较字符串,不区分大小写。该函数是 Windows 特有的。
- int strcasecmp (const char s1, const char s2); 比较字符串,不区分大小写。该函数是 Linux 下特有的。
思路、步骤
- 键盘获取字符串;
- 定义一个字符指针数组,用于保存字符串分割后的结果;
- 循环进行分割,按照空格进行分割,将每个分割后的字符串保存到字符指针数组中;
- 获取数组中的第一个元素(即运算操作),将第二个和第三个参数转换成整数(使用 atoi() 函数 );
- 判断运算操作的字符串(使用 strcasecmp() 函数),根据对应的操作完成相应的运算。
代码实现
#include <iostream> #include <cstring> using namespace std; int main() { char str[100] = { 0 }; cin.getline(str, sizeof(str)); char* msg[30] = { str, nullptr }; int i = 0; while ((msg[i] = strtok(msg[i], " ")) && ++i); char* op = msg[0]; int num1 = atoi(msg[1]); int num2 = atoi(msg[2]); if (strcasecmp(op, "add") == 0) { cout << num1 + num2 << endl; } else if (strcasecmp(op, "sub") == 0) { cout << num1 - num2 << endl; } else if (strcasecmp(op, "mul") == 0) { cout << num1 * num2 << endl; } else if (strcasecmp(op, "div") == 0) { if (num2 == 0) { cout << "Error" << endl; } else { cout << (double)num1 / num2 << endl; } } return 0; }