2015-09-16 4 views
1

Я хочу сделать синтаксический анализатор и первый шаг, который я имею в виду, - извлечь целые числа и операторы из входной строки и сохранить их в своих соответствующих массивах. То, что я до сих пор это ...Как отделить целые числа и операторы от строки в c?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

/* Grammar for simple arithmetic expression 
E = E + T | E - T | T 
T = T * F | T/F | F 
F = (E) 

Legend: 
E -> expression 
T -> term 
F -> factor 
*/ 

void reader(char *temp_0){ 
char *p = temp_0; 
while(*p){ 
    if (isdigit(*p)){ 
     long val = strtol(p, &p, 10); 
     printf("%ld\n",val); 
    }else{ 
    p++; 
    } 
} 

} 

int main(){ 
char expr[20], temp_0[20]; 

printf("Type an arithmetic expression \n"); 
gets(expr); 

strcpy(temp_0, expr); 

reader(temp_0); 

return 0; 
    } 

Скажем, у меня есть вход «65 + 9 - 4», и я хочу, чтобы хранить целые числа 65, 9, 4 до целого массива и операторов + , - в массиве операторов, а также игнорирует пробелы на входе. Как я должен это делать?

P.S. Я использую код в моей функции чтения, который я получил здесь: How to extract numbers from string in c?

+1

Каков ваш запрос (так как вы уже разделили цифры из строки, сделайте то же самое, чтобы извлечь операторы)? Также проверьте этот http://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be -used на том, почему 'gets() является опасным' –

+0

Какой у Вас вопрос? Возможно, вы забыли добавить «This is FYI» в конце: P – CinCout

+0

Скажем, у меня есть вход «65 + 9 - 4», и я хочу сохранить целые числа 65, 9, 4 в целочисленный массив и операторы + , - в массиве. Спасибо за предупреждение о получении(). – Ingvaru

ответ

0

Я написал образец теста. Извините за жесткий код, так как у вас слишком много времени. Но это хорошо работает на моем VS.

#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 
#include <ctype.h> 

int main(){ 
    //Here I think By default this string is started with an integer. 
    char *str = "65 + 9 - 4"; 
    char *ptr = str; 
    char ch; 
    char buff[32]; 
    int valArray[32]; 
    int val, len = 0, num = 0; 
    while ((ch = *ptr++) != '\0'){ 
     if (isdigit(ch) && *ptr != '\0'){ 
      buff[len++] = ch; 
     } 
     else{ 
      if (len != 0){ 
       val = atoi(buff); 
       printf("%d\n", val); 
       valArray[num++] = val; 
       memset(buff, 0, 32); 
       len = 0; 
      } 
      else if (ch == ' ') 
       continue; 
      else 
       printf("%c\n",ch); 
      } 
     } 
    } 
+0

Могу ли я узнать, что такое char ch? – Ingvaru

+0

На самом деле это просто символ, на который указывает указатель ptr в настоящее время, я использую это потому, что хочу закончить операцию ptr ++ в части определения цикла while. – chrischeng021

0

Вы можете передать целочисленный массив и массив оператора к функции render() в качестве параметров, как render(temp_0, arrNum, arrOperator, &numCount, &opCount), где arrNum является массивом длинных и arrOperator является массив char и numCount и opCount представляют собой два целых числа, которые будут обозначать число целых чисел и операторов соответственно. Эти два последних числа будут заполнены в render(). Тогда модифицированный render() функция может выглядеть как -

void reader(char *temp_0, long *arri, char *arro, int *numCount, int *opCount){ 
char *p = temp_0; 
int integerCount = 0; 
int operatorCount = 0; 

while(*p){ 
    if (isdigit(*p)){ 
     long val = strtol(p, &p, 10); 
     arri[integerCount++] = val; 
    }else{ 
     if((*p == '+') || (*p == '-') || 
      (*p == '/') || (*p == '*'))/* Add other operators here if you want*/ 
     { 
      arro[operatorCount++] = *p; 
     } 
    p++; 
    } 
} 

    *numCount = integerCount; 
    *opCount = operatorCount; 

} 

Обратите внимание, что нет никакой ошибки проверки делается в коде. Возможно, вы захотите добавить это.

+0

У меня проблемы с печатью ... Я разместил printf («% d \ n», arri [* p]); после arri [integerCount ++] = val; и printf ("% c \ n", arro [* p]); после arro [operatorCount ++] = * p; вывод отличается от моего ввода – Ingvaru

+0

printf должен быть как 'printf ("% d \ n ", arri [integerCount - 1]);' и 'printf ("% c \ n ", arro [operatorCount - 1 ]); 'as' operatorCount' и 'integerCount' являются индексом массива, а не' * p'. Также в 'printf()' индексы меньше, чем индексы 'operatorCount' и' integerCount', поскольку они уже увеличиваются в предыдущем выражении. – kuro

Смежные вопросы