scanf(“%s”,…)在读取字符串遇到第一个空白(空格,制表符,换行符)时该字符被当成NULL处理,就不再读取输入
根据%s转换说明,scanf()只会读取字符串中的第一个单词,而不是整句。
scanf(%d%s,…)(正确)
在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
scanf(%d,%s,…)(不推荐)
如果要用scanf(%d,%s,…),输入的数据也要用,隔开,因为用scanf()读取数据时,输入的格式必须和scanf()的格式控制字符串对应。
scanf函数中没有类似printf的精度控制。
如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数
在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。
scanf("%d\n"…)(非常不推荐)
写个程序,用scanf()读数据,只要不是%c就行。然后输入的时候,随便输入回车、空格、制表符,然后“回车”确认。会发现程序依然提示等待你输入。根据scanf会跳过输入值(%c除外)前面的空白的特性,它忽略掉所有前导空白符之后发现缓冲区是空的!于是乖乖地阻塞住,等待你输入。
如果像上述这样写,按下回车后C会帮你忽略’\n’,此时scanf读取缓冲区发现为空,以为你还没输入完,则阻塞住等待你输入的第一个有效数据
所以按一万个回车也不会重新开始读取输入,直到你输入第一个有效数字(例如‘5’)
scanf("%c",…)
从第一个输入字符开始读取
scanf(" %c",…)
从第一个非空白字符开始读取
参考资料:
https://blog.csdn.net/ll_dream/article/details/80253189?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
https://blog.csdn.net/qq_37548017/article/details/108804175?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163142184816780366571118%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163142184816780366571118&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v29_ecpm-15-108804175.pc_search_insert_download&utm_term=scanf+%5Cn&spm=1018.2226.3001.4187