一种宏,在C语言中读取变量直到变量在给定的时间间隔内

一种宏,在C语言中读取变量直到变量在给定的时间间隔内,c,C,我正在尝试创建一个宏,该宏读取变量,直到变量(在我的例子中是int-variable类型)处于间隔[min,max]内。我创建了一个宏来检查变量是否在一个区间内,但我不能在另一个宏中正确使用它,我陷入了一个无限循环。这是我的密码,你能帮我吗 #include <stdio.h> #include <stdlib.h> #define CHECK(x, n, m) ((x) > (n) && (x) < (m) ? 1 : 0) #define

我正在尝试创建一个宏,该宏读取变量,直到变量(在我的例子中是int-variable类型)处于间隔[min,max]内。我创建了一个宏来检查变量是否在一个区间内,但我不能在另一个宏中正确使用它,我陷入了一个无限循环。这是我的密码,你能帮我吗

#include <stdio.h>
#include <stdlib.h>
#define CHECK(x, n, m) ((x) > (n) && (x) < (m) ? 1 : 0)
#define READ(TEXT, P, VAR, min, max)                                           \
  do {                                                                         \
    printf(TEXT ": ");                                                         \
    scanf("%" #P, &VAR);                                                       \
  } while (x = (CHECK((VAR), (min), (max))) == 0)
int main(void) {
  int x, min1, max1;
  printf("min=");
  scanf("%d", &min1);
  printf("max=");
  scanf("%d", &max1);
  READ("x=", g, x, min1, max1);
  // int i=CHECK(x,min1,max1);
  // printf("%d\n",i);

  return 0;
}
#包括
#包括
#定义检查(x,n,m)((x)>(n)和&(x)<(m)?1:0)
#定义读取(文本、P、变量、最小值、最大值)\
做{\
printf(文本):\
scanf(“%”#P和VAR)\
}而(x=(检查((VAR),(min),(max))==0)
内部主(空){
int x,min1,max1;
printf(“min=”);
scanf(“%d”&min1);
printf(“max=”);
scanf(“%d”和&max1);
读取(“x=”,g,x,min1,max1);
//int i=检查(x,min1,max1);
//printf(“%d\n”,i);
返回0;
}

检查
宏看起来很好。我认为
READ
宏应该是:

#define READ(TEXT, P, VAR, min, max)                                           \
  do {                                                                         \
    printf(TEXT ": ");                                                         \
  } while (scanf("%" P, &VAR)!=1 || CHECK((VAR), (min), (max))) == 0)
READ("x=", "d", x, min1, max1);
这些变化是:

  • scanf
    检查返回值

  • x=(选中…
    的赋值被删除,因为
    x
    不是宏参数,任何赋值都是由
    scanf
    完成的

main中的变量
g
没有定义。我认为调用应该是:

#define READ(TEXT, P, VAR, min, max)                                           \
  do {                                                                         \
    printf(TEXT ": ");                                                         \
  } while (scanf("%" P, &VAR)!=1 || CHECK((VAR), (min), (max))) == 0)
READ("x=", "d", x, min1, max1);
现在,编译器将字符串
“%”
“d”
追加到
“%d”


在这些情况下,让编译器(预处理器)生成预处理器结果并检查宏是否按您的要求展开是很方便的。

while(x=(选中…
remove
x=
。它不是宏的一部分,它会按字面意思展开。@PaulOgilvie只是在它上面应用了clang格式,其他什么都没有……嗯。编辑:回滚。格式与源代码一致,第一个宏上的\没有意义。我的意思是,我有时可能很笨,但clang格式不应该改变代码ing.
scanf(“%”)不起作用。您需要添加一个类型字符:
scanf(“%d”
难道您不想
scanf(…)==1&&CHECK(…)==0
?就像[with
|
]一样,如果任何内容读取成功,检查将永远不会执行,检查[失败]不应该停止循环吗?