C 如何获取字符串并将其用作计算?

C 如何获取字符串并将其用作计算?,c,string,C,String,假设他们输入r=(i==16),我如何获取这个,然后为输出运行那个 这就是我得到的错误 G:\code\Tutorial 3\main.c | 104 |错误:数组类型表达式赋值 代码 #包括 #包括 #包括 int main() { int答案; 字符操作[20]; int i=16; int j=32; int k=8; 布尔r; printf(“输入操作:\n”); fgets(操作、尺寸(操作)、标准DIN); 操作=回答; 如果(答案=1) printf(“您输入的操作为true”)

假设他们输入
r=(i==16)
,我如何获取这个,然后为输出运行那个

这就是我得到的错误

G:\code\Tutorial 3\main.c | 104 |错误:数组类型表达式赋值


代码

#包括
#包括
#包括
int main()
{
int答案;
字符操作[20];
int i=16;
int j=32;
int k=8;
布尔r;
printf(“输入操作:\n”);
fgets(操作、尺寸(操作)、标准DIN);
操作=回答;
如果(答案=1)
printf(“您输入的操作为true”);
其他的
printf(“您输入的操作是错误的。”);
}

简短回答:你不能。C是一种编译语言,与解释语言不同,它不能将字符串作为命令进行动态计算

您可以做的是创建一些允许操作的子集并手动计算它们。诸如此类:

if (operation[0] == 'i' and operation[1] == '=' and operation[2] == '=')
{
    answer = (i == atoi(&operation[3]));
} else if (...)
...

如果我理解正确,您希望允许用户输入包含一段C代码的字符串。在您的示例中,输入字符串是
r=(i==16)

然后,您希望执行用户输入的任何一段C代码。如果输入的C代码包含任何变量(
r
i
,在您的示例中),您希望在程序中使用实际变量的值

因为C是一种编译语言,所以实现这一点非常困难(我认为几乎不可能)。您必须编写一个编译器将输入的C代码编译成机器代码。即使这样,让生成的机器代码访问运行程序中的上下文(例如变量)也是极其困难的

无意冒犯,但这种锻炼远远超出了你的水平。如果这是一个作业,这不是你的老师要你做的

PS 1:如果输入不是一段任意的C代码,而只是一个带有有限运算符集的表达式,那么任务就会变得更简单


PS 2:在更动态的语言(如Python)中,这更容易实现(例如,看看Python
eval
语句)。如果您可以灵活地选择编程语言,那么使用Python之类的工具可能是更好的方法。

正如其他用户所说,您可以编写以前接受的操作。然后,如果要执行特殊命令,可以使用
exec
族在创建的child中使用
fork

使用此表达式
操作=答案
您正试图将一个(未初始化的)
int
值分配给指向
char
数组的指针

虽然此表达式本身完全无效,但请注意,在以任何方式使用变量之前,始终应初始化变量。否则,它们只有一个随机的“garbarge”值,您稍后在程序中使用它,可能会导致更多错误

这就是导致您指向的错误消息的原因

除此之外,您的程序还有更多需要关注的问题

你到底想用这个程序做什么

回答的目的是什么?为什么
answer
没有得到赋值

为什么不想为数组指定
answer
的特定值

此外,

    if (answer == 1)
        printf("The operation you entered was true.");
    else
        printf("The operation you entered was false.");

也很疯狂,因为
answer
之前没有得到值,所以你不能用它来设置条件。

operation=answer你期望它做什么?我希望它会运行他们输入的操作,然后将输出设置为“应答”,即使这样做有效(当然不会),你至少需要交换操作数。您正在为一个操作分配一个答案,这在逻辑上是没有意义的。但您只是在
操作
中输入了一个字符串,所以试图用任何内容覆盖它是没有意义的。@LewisRoberts从逻辑上讲,这不应该是
answer=operation(在伪代码中)。并不是说这在实际的C代码中是可行的。啊,好的,无论如何,谢谢,我会修改它。
    if (answer == 1)
        printf("The operation you entered was true.");
    else
        printf("The operation you entered was false.");