具有字符数组的sscanf始终计算为true
我遇到了一个小问题,我的sscanf产品线总是评估为真。如果fgets传递一个没有数字的字符串,我希望它的计算结果为false…这里有什么建议/帮助吗具有字符数组的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)
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时,它是真的,但这可能不是您想要的。