我试图在一个等式中读取,然后分别取出每个部分,然后用户可以输入他们喜欢的大或小等式(例如.3 + 7,2 + -9 + 8或甚至2)。我有这个,但它似乎没有工作。
printf("Please enter an equation\n");
scanf("%f", &num);
//printf("%f", num);
while ( num != '\n'){
scanf("%f", &num);
scanf("%c", &op);
//printf("%c %f \n", op, num);
}
当我输出我得到的信息与输入信号不同时。
答案 0 :(得分:1)
您可能希望阅读How to read a line from the console in C?了解完整详情,但基本上您只需执行此操作:
char * getline(void) {
char * line = malloc(100), * linep = line;
size_t lenmax = 100, len = lenmax;
int c;
if(line == NULL)
return NULL;
for(;;) {
c = fgetc(stdin);
if(c == EOF)
break;
if(--len == 0) {
len = lenmax;
char * linen = realloc(linep, lenmax *= 2);
if(linen == NULL) {
free(linep);
return NULL;
}
line = linen + (line - linep);
linep = linen;
}
if((*line++ = c) == '\n')
break;
}
*line = '\0';
return linep;
}
答案 1 :(得分:1)
您正在尝试在float变量中使用完整表达式(num,在您的代码中)。如果在while循环中执行scanf("%f", &num);
,则只需覆盖num中的值。您需要将表达式放在char数组或char *中。然后你需要有一个algrithm来分隔运算符和数字,将数字转换为所需的类型并解决euation。
答案 2 :(得分:0)
如果你想阅读一个表达并让你的程序明白这一点,你需要更重的机器。要么这是XY problem,要么你需要重新思考问题并找到另一种方法;或者您应该查看整个解析/编译区域。
脚本语言(如Python或Perl)有一些eval
内置函数,因此您可以将一段代码作为文本并进行评估(运行)。也许使用其中一个可以更好地匹配您的问题?但要小心,盲目地运行用户输入的任何内容都是巨大的风险......
答案 3 :(得分:0)
要使用scanf读取任意长度的行,可以使用
scanf("%[^\n]", equation);
这个正则表达式意味着“读取所有内容,直到找到'\ n'字符”。 请记住,这不安全,因为用户可以轻松地溢出“方程式”缓冲区。如果你想避免这种情况,我建议在循环中通过char读取char,如下所示:
for(i=0; i < MAX_EQ_SIZE; i++)
{
char tmp;
scanf("%c", &tmp);
if(tmp == '\n')
break;
equation[i] = tmp;
}
因为你问的是如何读,所以我不打算解析读方程。 这是一个代码示例:
#include <stdio.h>
#define MAX_EQ_SIZE 1024
void parse(char * eq)
{
// Do the processing
}
int main()
{
char equation[MAX_EQ_SIZE];
scanf("%[^\n]", equation); // Read a whole line
scanf("%*c"); // Read and ignore the \n
puts(equation);
parse(equation);
}
答案 4 :(得分:0)
使用fgets()
读取输入行。
使用sscanf()
的返回值来确定数字或运算符。
int Eval(void) {
char buffer[100];
char *p = buffer;
printf("Please enter an equation\n");
if (fgets(buffer, sizeof buffer, stdin) == NULL)
return -1; // no more input
float num;
char op;
int n;
while (*p) {
if (sscanf(p, "%f %n", &num, &n) == 1) {
printf("num %f\n", num);
p += n;
}
if (sscanf(p, " %c %n", &op, &n) == 1) {
printf("op %c\n", op);
p += n;
} else if (*p) {
printf("Error '%s'\n", p);
return 0;
}
}
return 1;
}