以下C语言代码片段在做什么?

时间:2013-12-10 11:30:02

标签: c

以下代码段是评估后缀表达式的程序的一部分。我对C编程没有太多经验,所以原谅我的知识较少。我不明白代码中突出显示的部分是做什么的。

char str[100];

int i, data = -1, operand1, operand2, result;

/* Get the postfix expression from the user */

printf("Enter ur postfix expression:");

fgets(str, 100, stdin);

for (i = 0; i < strlen(str); i++) 
{

    if (isdigit(str[i])) 
    {
          /*
           * if the i/p char is digit, parse
           * character by character to get
           * complete operand
           */
           data = (data == -1) ? 0 : data;

           data = (data * 10) + (str[i] - 48);   //What is happening here 

           continue;
}

4 个答案:

答案 0 :(得分:2)

它将字符串str中的数字转换为实际数字,每位数字(或者每个字符的字符,如果你愿意的话)。

该行

data = (data * 10) + (str[i] - 48);

将数字“到目前为止”并将新数字加到其上,方法是将数字乘以10,然后将str[i]的值加到其中。字符str[i]在“0”...“9”的范围内,通过减去其中的48个 - “0”的ASCII值 - 您将获得该数字的值。

所以如果data是95;例如,str[i]为'3',则data变为950 + ASCII代码'3' - ASCII代码为'0',因此data变为950 + 3 = 953。

答案 1 :(得分:2)

  data = (data * 10) + (str[i] - 48);

该行将str[i]的值转换为整数值并转换整数(因此乘以10)。 E.g。

'0' - &gt; 0 '1' - &gt; 1 例如“100” - &gt; 100

它假定ASCII表示,因此使用48。更便携的方式是使用'0'代替:

  data = (data * 10) + (str[i] - '0');

答案 2 :(得分:1)

根据您的代码段

** data =(data * 10)+(str [i] - 48);

此行会将您的字符串更改为整数格式

例如,您正在提供输入235

然后2的ASCII码是50,当你用48减去那么它将是2。 现在将之前的no(即0)乘以10并加2,然后它将变为2 接下来3将有51个ASCII,减去48后将变为3 现在将之前的no(即2)乘以10并加3,然后它将变为23,依此类推。

像这样你将字符串转换为整数no。

答案 3 :(得分:0)

为了更好地理解打印在中间实例中生成的值,因为您在C程序中没有太多经验,有一个printf语句,以便您可以理解逻辑。

#include <stdio.h>
#include <string.h>
#include<ctype.h>
#include<conio.h>
  int top = -1;
  int stack[100];

  /* push the given data into the stack */
  void push (int data) {
    stack[++top] = data;
  }

  /* Pop the top element from the stack */
  int pop () {
    int data;
    if (top == -1)
        return -1;
    data = stack[top];
    stack[top] = 0;
    top--;
    return (data);
  }

  int main() {
    char str[100];
    int i, data = -1, operand1, operand2, result;
    /* Get the postfix expression from the user */
    printf("Enter ur postfix expression:");
    fgets(str, 100, stdin);
    for (i = 0; i < strlen(str); i++) {
        if (isdigit(str[i])) {
            /*
             * if the i/p char is digit, parse
             * character by character to get
             * complete operand
             */
            data = (data == -1) ? 0 : data;
            printf("%d value of str[i] ",str[i]); // returns the ascii value 
            data = (data * 10) + (str[i] - 48);   //multiplies with ten and substracts with 48 so thst u get ur input number
            printf("%d\n",data);       
            continue;
        }

        if (data != -1) {
            /* if the i/p is operand, push it into the stack */
            push(data);
        }

        if (str[i] == '+' || str[i] == '-'
            || str[i] == '*' || str[i] == '/') {
            /*
             * if the i/p is an operator, pop 2 elements
             * from the stack and apply the operator
             */
            operand2 = pop();
            operand1 = pop();
            if (operand1 == -1 || operand2 == -1)
                break;
            switch (str[i]) {
                case '+':
                    result = operand1 + operand2;
                    /* push the result into the stack */
                    push(result);
                    break;
                case '-':
                    result = operand1 - operand2;
                    push(result);
                    break;
                case '*':
                    result = operand1 * operand2;
                    push(result);
                    break;
                case '/':
                    result = operand1 / operand2;
                    push(result);
                    break;
            }
        }
        data = -1;
    }
    if (top == 0)
        printf("Output:%d\n", stack[top]);
    else
        printf("u have given wrong postfix expression\n");
    getch();
    return 0;
  }

输出:enter image description here