Как перевести значение ячейки массива char в int - C (СИ)

Узнай цену своей работы

Формулировка задачи:

пример: char stroka[]='562/-2^52*'; int cifri[3]; cifri[0]=(int)stroka[0]; - то есть, мне надо перевести нулевой элемент строки (в данном случае это цифра 5) в нулевой элемент массива чисел, то есть в данном примере хочу чтобы в ячейку cifri[0] занеслась цифра 5. Но на самом деле происходит нечто иное, а именно в ячейку cifri[0] заносится значение 562 Задача полностью: Вычисление значения выражения. Вводится строка символов (цифры и символы +-/*^) и нужно сначала определить какой вид - префикс или постфикс и найти значение выражения. Пример: строка strr[]='54+3/43^8/+' - это будет постфикс. (если бы цифры начинались с права то это был бы префикс, и вычисления шли бы с права на лево) Решение: 5+4=9 strr='93/43^8/+' 9/3=3 strr='343^8/+' 4^3=64 strr='3 64 8/+' 64/8=8 strr='38+' 3+8=11 - это и есть результат. Сам код проги:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define izt_gar 100
 
short int veids(char *virk, int gar);  
int postfiksa(char *virk, int gar);     
int prefiksa(char *virk, int gar);      
 
int operacija(int,char,int);
 
main(){
       char virkne[izt_gar],flag;
       
       int garums=0,v,buf[3]; 
       puts("Vvedite stroku simvolov");
       puts("Razreshennije simvoli: \"+\" \"-\" \"*\" \"/\" \"^\"");
       gets(virkne);
       puts(virkne);
       v=atoi(&virkne[0]);
       printf("\nv= %d\n",v);
       while (virkne[garums]!='\0') 
             garums++;
       printf("Garums: %d simboli   ",garums);
       
       v=veids(virkne,garums);
       if (v==0){
          printf("Postfiks!");
          printf("Rezultat virazenijs: %d",postfiksa(virkne,garums));
          scanf("%d",&v);
          }
       else
           if(v==1){
             printf("Prefiks!");
             printf("Zna4enije virazenija: %d",prefiksa(virkne,garums));
             scanf("%d",&v);
             }      
}

short int veids(char *virk, int gar){         
      int v;                // v=0 -> postfiksa; v=1 ->prefiksa;
      if (virk[0]>='0' && virk[0]<='9' && virk[1]>='0' && virk[1]<='9')
         v=0;
      else{
           if (virk[gar-1]>='0' && virk[gar-1]<='9' && virk[gar-2]>='0' && virk[gar-2]<='9')
             v=1;           
           else{
                puts("Stroka vvedena nepravilno! Programma zakan4ivajet svoju rabotu.");
                scanf("%d",&gar);
                exit(1);
                }
           }
      return v;
}

int postfiksa(char *virk, int gar){
    int solis=1;
    int n=1;
    int buf[gar/2+1];
    buf[0]=virk[0];
    buf[1]=atoi(&virk[1]);
    printf("\nvirk[0]=%c buf[0]=%d",virk[0],buf[0]);
    printf("\nvirk[1]=%c buf[1]=%d\n",virk[1],buf[1]);
    //printf("\nbuf[0] = %d buf[1]=%d\n",buf[0],buf[1]);
    
    while(solis<gar){
                     if(virk[solis+1]=='+' || virk[solis+1]=='-' || virk[solis+1]=='/' || virk[solis+1]=='*' || virk[solis+1]=='^'){
                                           buf[n-1]=operacija(buf[n-1],virk[solis+1],buf[n]);
                                           buf[n]='\0';
                                           solis++;
                                           n--;
                                           }
                     else{
                          buf[n+1]=atoi(&virk[solis+1]);
                          solis++;
                          n++;
                          //printf("\nbuf[%d]=%c",n+1,buf[n+1]);
                          }
                     }    
    return buf[0];
}

int prefiksa(char *virk, int gar){
    int solis=gar-2;
    int n=1;
    int buf[gar/2+1];
    buf[0]=(int)virk[gar-2];
    buf[1]=(int)virk[gar-1];
    
    while(solis!=0){
                     if(virk[solis-1]=='+' || virk[solis-1]=='-' || virk[solis-1]=='/' || virk[solis-1]=='*' || virk[solis-1]=='^'){
                                           buf[n-1]=operacija((int)buf[n-1],virk[solis-1],(int)buf[n]);
                                           buf[n]='\0';
                                           solis--;
                                           n--;
                                           }
                     else{
                          buf[n+1]=(int)virk[solis-1];
                          solis--;
                          n++;
                          }
                     }    
    return buf[0];
}

int operacija(int a,char b,int c){
    printf("\na=%d b=%c c=%d\n");
    if (b=='+')
       return(a+c);
    if (b=='-')
       return(a-c);
    if (b=='*')
       return(a*c);
    if (b=='/')
       return(a/c);
    if (b=='^')
       return(pow(a,c));
    exit(1);
}
Колдую это все дело на Dev-C++. По заданию всё должно быть только на C. На бумаге не раз проверял - сам алгоритм рабочий. Проблема только в переводе char -> int

Решение задачи: «Как перевести значение ячейки массива char в int»

textual
Листинг программы
char a='j';

Объяснение кода листинга программы

  1. Объявляется переменная a типа char с начальным значением 'j'.
  2. Переменная a имеет тип char, что означает, что она может хранить только однобайтовые значения. Значение 'j' представляется в кодировке ASCII как 109.
  3. Для перевода значения переменной a в int необходимо выполнить ряд преобразований.
  4. Во-первых, значение переменной a приводится к типу unsigned char. Это необходимо, чтобы избежать отрицательного значения, которое могло бы получиться при прямом приведении к int.
  5. Затем, полученное значение типа unsigned char приводится к типу int.
  6. Результатом будет значение 109, представляющее символ 'j' в кодировке ASCII.
  7. Это значение можно использовать в дальнейших вычислениях как значение типа int.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.571 из 5
Похожие ответы