0

我遇到了一个问题,我的 sscanf 行总是评估为真。如果 fgets 传递一个没有数字的字符串,我希望它评估为 false ......这里有什么建议/帮助吗?

int main(void){
  int choice;
  char buffer[LINESIZE];

 while (1){
   printf("\nprompt");

   if(fgets(buffer,LINESIZE, stdin)){
        if(sscanf(buffer, "%d", &choice)){
     /* do something*/ 
     else 
      /*do something else*/
4

1 回答 1

1

正如评论中所说 sscanf() 返回匹配的参数数量;C 中的标准行为是 0 被隐式转换为 FALSE,其他任何内容都被转换为 true,所以我猜可能会发生 2 件事,要么你的字符串总是包含一个整数,它总是读取一些东西,要么你的编译器正在做一些奇怪的事情,它是将 0 转换为 true(非常奇怪)

但在这两种情况下,您都可以通过如下方式修改代码来解决此问题

int main(void){
  int choice;
  char buffer[LINESIZE];

 while (1){
   printf("\nprompt");

   if(fgets(buffer,LINESIZE, stdin)){
        if(sscanf(buffer, "%d", &choice) != 0){  // be carefull with EOF 
     /* do something*/ 
     else 
      /*do something else*/

您将获得想要的结果,并且您将拥有更具可读性的代码(并且正确,因为您不进行奇怪的演员表)

于 2013-01-30T18:24:56.230 回答