我遇到了类型转换的麻烦。
#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
感谢任何帮助
答案 0 :(得分:5)
您将ASCII数字打印为整数。 '4'
的ASCII值为52
。改为:
fprintf(stdout, "%c Simple Numeral\n",buffer[i]);
对isdigit()
的调用中的类型转换完全没有必要(且无关)。
答案 1 :(得分:1)
您获得52
,因为字符'4'
的ASCII代码点 1 ,如下图所示:
如果您想将其打印为字符,则应在%c
声明中使用%d
而不是printf
:
fprintf(stdout, "%c Simple Numeral\n",buffer[i]);
顺便说一句,我并不完全确定您为什么要使用
fprintf(stdout,...
而不仅仅是printf(...
。后者在功能上是相同的,并且可以减少你打字的次数。
1 ASCII不是 标准,但它是迄今为止最常见的,更重要的是,这里是你似乎正在使用。