Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有字符数组的sscanf始终计算为true_C - Fatal编程技术网

具有字符数组的sscanf始终计算为true

具有字符数组的sscanf始终计算为true,c,C,我遇到了一个小问题,我的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)

我遇到了一个小问题,我的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*/

如注释中所述,sscanf()返回匹配的参数数量;C语言中的标准行为是0隐式转换为FALSE,其他任何内容都转换为true,因此我猜可能会发生两种情况:字符串总是包含整数,它总是读取某些内容,或者编译器做了一些奇怪的事情,它将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*/

您将得到想要的结果,并且您将拥有一个可读性更高的代码(而且是正确的,因为您不进行奇怪的强制转换)

通过将它分配给一个变量来确定它返回的是哪个值。@AntonKovalenko
sscanf
返回匹配的项数。@op我认为您在做其他事情(这不是问题中的事情)错
sscanf
如果没有匹配项,则返回0。sscanf实际上不返回“真”或“假”,但它返回它设法匹配的对象数,或文件末尾的EOF(负数)。如果对sscanf的调用无法将“%d”与任何内容匹配,则将返回0,因此您的程序中可能存在其他错误。不太模糊的条件应该是:
if(sscanf(buffer,“%d”,&choice)==1)
,因为当sscanf返回EOF时,它是真的,但这可能不是您想要的。