使用具有多种数据类型的scanf

时间:2014-11-04 08:04:11

标签: c gcc types scanf

我试图以mx + b = y的形式读取等式,其中m,b和y是整数,x是一个字符。如何读取整数和字符,并检查用户是否以该确切的形式输入数据。也就是说,我需要检查用户输入一个'+'符号和'='符号并使用正确的变量。例如:我希望它接受mx + b = y而不是mX + b = y或另一个例子:接受mx + b = y但不接受mx-b = y。我也需要它忽略等式后的任何额外输入。

我尝试过使用类似的东西:

scanf(“%d%c%c%d%c%d”,& m,& x,& sign,& b,& equal_sign,& y);

使用此格式,它会正确读取第一个数字,但会跳过将下一个字符放入变量x,而是将其放入符号中。

对于冗长的措辞感到抱歉,但我很感激任何帮助,如果我需要澄清任何事情,请告诉我。感谢。

3 个答案:

答案 0 :(得分:4)

我会使用getline(3)fgets(3)读取整行,然后手动解析包含该行的缓冲区,使用带有给定结束指针的strtol(3)sscanf(3)(显式测试返回的计数,也许使用%n格式说明符。)

您可能希望将parse表达式加入AST,例如使用一些recursive descent parsing技术。另请参阅infix-calc example of GNU bison

如果您确定输入完全 x + b = c (对3x+-5=8来说不自然,因为你只想输入3x-5=8),你可以使用strtol的混合。另请参阅strncmp(3)strtok(3)

PS。关注所有我在这里给你的链接。他们所有相关!

答案 1 :(得分:0)

以字符串格式(缓冲区)获取等式,并使用sscanf函数解析此缓冲区。通过使用scanf函数可能存在类似事物的问题

答案 2 :(得分:-1)

当您收到输入提示时,您应该尝试输入一个值而不是标签而不是另一个值而不是标签...依此类推。直到你输入所有值。

scanf(“%d%c%c%d%c%d”,& m,& x,& sign,& b,& equal_sign,& y);

您输入的第一个值将分配给m, 按下选项卡后 第二个值将分配给x 按标签..

在您输入所有值之前执行此操作..