在C程序中进行类型转换

时间:2015-04-08 02:52:14

标签: c

我遇到了类型转换的麻烦。

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

FILE *
input_from_args(int argc, const char *argv[])
{
  if (argc == 1){
    return stdin;
  }else{
    return fopen(argv[1], "r");
  }
}

void
tokenize(FILE *src)
{
  char buffer[80];

  if (fgets(buffer, 80, src) == NULL){
    fprintf(stdout, "The line is NULL");
  }else{
    fprintf(stdout,"%s\n", buffer);
    int i = 0;
    while (fscanf(src, "%s", &buffer[i]) && buffer[i] != '\n'){
      if(buffer[i] == ' '){
    i++  ;
      }else if (buffer[i]=='+'){
    fprintf(stdout,"+    Addition operator\n");
    i++;
      }else if (buffer[i]=='-'){
    fprintf(stdout,"-    Subtraction operator\n");
    i++;
      }else if (buffer[i]=='*'){
    fprintf(stdout,"*    Multiplication operator\n");
    i++;
      }else if (buffer[i]=='/'){
    fprintf(stdout,"-    Division operator\n");
    i++;
      }else if (buffer[i]=='^'){
    fprintf(stdout,"-    Exponentiation operator\n");
    i++;
      }else if( buffer[i]== '>'){
    if(buffer[i+=1] == '='){
      fprintf(stdout, ">=    Comparison Operator\n");
      i+=2;
    }else{
      fprintf(stdout,">    Comparison Operator\n");
      i+=1;
    }
      }else if( buffer[i]== '<'){
    if(buffer[i+=1] == '='){
      fprintf(stdout, "<=    Comparison Operator\n");
      i+=2;
    }else{
      fprintf(stdout,"<    Comparison Operator\n");
      i+=1;
    }
      }else if (isdigit((int)buffer[i])){
    fprintf(stdout, "%d    Simple Numeral\n",buffer[i]);
    i++;
      }else if (buffer[i] == ')'){
    i++;
      }else if (buffer[i] == '('){
    i++;
      }
    }
  }
}
int
main(int argc, const char* argv[])
{

  FILE* src = input_from_args(argc, argv);
  tokenize(src);
  return 0;
}

我正在尝试在isdigit函数中输入强制转换。它编译得很好但是当它打印数字时,它不是正确的数字。例如,如果buffer[i] == '4'则打印52

感谢任何帮助

2 个答案:

答案 0 :(得分:5)

您将ASCII数字打印为整数。 '4'的ASCII值为52。改为:

    fprintf(stdout, "%c    Simple Numeral\n",buffer[i]);

isdigit()的调用中的类型转换完全没有必要(且无关)。

答案 1 :(得分:1)

您获得52,因为字符'4'的ASCII代码点 1 ,如下图所示:

enter image description here

如果您想将其打印为字符,则应在%c声明中使用%d而不是printf

fprintf(stdout, "%c    Simple Numeral\n",buffer[i]);
  

顺便说一句,我并不完全确定您为什么要使用fprintf(stdout,...而不仅仅是printf(...。后者在功能上是相同的,并且可以减少你打字的次数。


1 ASCII不是 标准,但它是迄今为止最常见的,更重要的是,这里是似乎正在使用。