我在计算机课上正在学习C,今天我们被介绍给scanf。这是用来介绍scanf的代码行:
#includevoid main() { float x,y; scanf("%f %f",&x,&y); printf("%2f\n",x+y); }
这很好用,如果您输入两个数字,它将打印总和。我认为它可能像pythons输入函数一样工作,因此我修改了上面的代码以在scanf中包含一些文本,如下所示:
#includevoid main() { float x,y; scanf("insert no in format x y %f %f",&x,&y); printf("%2f\n",x+y); }
我得到的输出不是10,而是一些随机数。我说随机是因为我尝试多次运行代码,每次我收到不同的输出。
这与内存分配有关吗?scanf可以不是字符串吗?
scanf
用于读取输入,而不是打印输出。如果您在其中放置文本,它将尝试匹配该文本。如果它与该文本不匹配(您必须输入该确切文本),则该函数将失败,并且如果您稍后尝试使用这些值,则它是未定义的行为。参见此处(重点是我的):
非空格字符,格式说明符(%)除外:不是空格字符(空白,换行符或制表符)或格式说明符一部分(以%字符开头)的任何字符都会导致该函数读取下一个字符从流中将其与该非空白字符进行比较,如果匹配,则将其丢弃,并且该函数将继续使用格式的下一个字符。如果字符不匹配,函数将失败,返回并保留流中的后续字符未读。
您可以通过检查返回值来确保它成功读取了值:
成功时,该函数返回已成功填充的参数列表的项目数。由于匹配失败,读取错误或文件结尾的范围,此计数可以与预期的项目数匹配或更少(甚至为零)。
因此,在这种情况下,您的返回值应为2
。
如果要打印该文本,可以使用printf
:
printf("insert no in format x y"); if (scanf("%f %f",&x,&y) != 2){ printf("Error reading in the parameters!"); return -1; };