Output result string after numbers addition and subtraction

题目描述: 

通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。

输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:

1. 操作数为正整数,不需要考虑计算结果溢出的情况。

2. 若输入算式格式错误,输出结果为“0”。

要求实现函数: 

void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);

输入

pInputStr:  输入字符串

lInputLen:  输入字符串长度

输出

pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

<span style="font-size:10px;">#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXCHAR 10

void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr)
{
    int i, cnt = 0, a, b, result;
    char ch[1] = {'0'};
    char op1[MAXCHAR], op[MAXCHAR], op2[MAXCHAR], buffer[4];
    for(i = 0; i < lInputLen; i++)
        if(pInputStr[i] == ' ')
            cnt++;

    if(cnt != 2)                    //空格数不等于2
    {
        strcat(pOutputStr, ch);
        return;
    }

    sscanf(pInputStr, "%s %s %s", op1, op, op2);

    if(strlen(op) > 1 || (op[0] != '+' && op[0] != '-'))
    {
        strcat(pOutputStr, ch);
        return;
    }

    for(i = 0; i < strlen(op1); i++)
    {
        if(op1[i] < '0' || op1[i] > '9')
        {
            strcat(pOutputStr, ch);
            return;
        }
    }

    for(i = 0; i < strlen(op2); i++)
    {
        if(op2[i] < '0' || op2[i] > '9')
        {
            strcat(pOutputStr, ch);
            return;
        }
    }

    a = atoi(op1);
    b = atoi(op2);

    switch(op[0])
    {
        case '+':
            result = a + b;
            itoa(result, buffer, 10);
            strcat(pOutputStr, buffer);
            break;
        case '-':
            result = a - b;
            itoa(result, buffer, 10);
            strcat(pOutputStr, buffer);
            break;
        default:
            break;
    }
}
int main()
{
    char pInputStr3[] = {"3 + 4"};
    char pOutputStr3[MAXCHAR] = {0};
    arithmetic(pInputStr3, strlen(pInputStr3), pOutputStr3);
    printf(pOutputStr3);
    return;
}</span>

知识点

1.sscanf() - 从一个字符串中读进与指定格式相符的数据.

 函数原型:

     int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

     int scanf( const char *format [,argument]... );

 说明:

     sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

参考:

http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html参考:

2.itoa() -

函数原形:

char *itoa( int value, char *string,int radix);

说明:

value:欲转换的数据。

string:目标字符串的地址。

radix:转换后的进制数,可以是10进制、16进制等。

例子:

把一个整数转换为字符串用法itoa(i,num,10);

i ----需要转换成字符串的数字

num---- 转换后保存字符串的变量

10---- 转换数字的基数(即进制)。10就是说按10进制进行转换。还可以是2,8,16等等你喜欢的进制类型

返回值:指向num这个字符串的指针

3.atoi( )用法与iota( )正好相反

参考程序:http://blog.csdn.net/poinsettia/article/details/9569987程序:

时间: 2024-10-04 06:13:47

Output result string after numbers addition and subtraction的相关文章

[leetcode-592-Fraction Addition and Subtraction]

Given a string representing an expression of fraction addition and subtraction, you need to return the calculation result in string format. The final result should be irreducible fraction. If your final result is an integer, say 2, you need to change

LC 592. Fraction Addition and Subtraction

Given a string representing an expression of fraction addition and subtraction, you need to return the calculation result in string format. The final result should be irreducible fraction. If your final result is an integer, say 2, you need to change

[Swift]LeetCode592. 分数加减运算 | Fraction Addition and Subtraction

Given a string representing an expression of fraction addition and subtraction, you need to return the calculation result in string format. The final result should be irreducible fraction. If your final result is an integer, say 2, you need to change

HDOJ 1002 A + B Problem II (Big Numbers Addition)

题目链接在此?http://acm.hdu.edu.cn/showproblem.php?pid=1002 这题也比较简单,只需要开三个长度为1000的char数组来分别储存a.b.ans,再利用我们加法的算法,先向右对齐再相加.注意一下进位时的特殊情况就好了. 不过笔者的代码写好后提交上去,两次Presentation Error,然后才发现只是最后多输出一个空行的问题  =.= Orz /**  * HDOJ 1002 A + B Problem II  * Big Numbers Addi

[Math_Medium] 592. Fraction Addition and Subtraction

原题:592. Fraction Addition and Subtraction 题目大意: 给出一个分数字符串式子(分子分母都是1~10),求其和 解题思路: 利用stringstream,它可以自动地实现字符串和数字之间的转换,比如 -1/2,可以输出为-1,/,2,把每个数取出来后就通分进行计算 代码: class Solution{ public: int gcd(int a,int b) { int c=0; while(b) { c=a%b; a=b; b=c; } return

arc066E - Addition and Subtraction Hard

题目链接 题目大意 给定一个只含加减和数字的表达式,在其中添加括号,使其值最大. 解题思路 显然,只有减号后面的括号会使其中表达式的值取反. 然后只有已经有左括号时才能加入右括号. 所以用\(f_0\)表示没有左括号,用\(f_1\)表示当前是负区间,\(f_1\)表示当前是正区间. 当当前的数是负的时,可以加入左括号转移.当存在左括号时,可以加入右括号转移. 代码 #include<iostream> #include<cstdio> #include<cstdlib>

YASM User Manual

This document is the user manual for the Yasm assembler. It is intended as both an introduction and a general-purpose reference for all Yasm users. 1.?Introduction Yasm is a BSD-licensed assembler that is designed from the ground up to allow for mult

GUI &amp; Event例子

Student No.: _______________ Name: ________________________________________1TK2934 Object-Oriented ProgrammingProject : GUI & EventIn this lab you will be using the following Java Swing & awt classes:• container – JFrame, JPanel• components – JBut

按单词(word)反转字符串(string)输出(output)——不用额外缓存(without a buffer)

一道笔试题,纸上写的,誊到电脑上并调试通过并改善. 没经验,菜鸟摸索的野蛮算法,不知道有没有更简洁更抽象的算法. 打算用现成字符串操作函数的请绕行搜索. 原题是不用buffer(缓存)反转字符串打印输出,受OJ的毒害,我就认为只要逆序打印就行了(要是把原字符串改了,我还真不知道怎么办到,尤其听说字符串常量不能被更改,在文章尾部会做验证). v0.1: 用了一下递归,思路是用指针遍历字母,每碰到空格就用新指针往下递归调用一次,碰到结束符呢,就结束呗.有两个细节,如果空格之后还是空格呢?所以你需要指