C语言使用%d读入字符会发生什么

指定了%d来读取一个整数,scanf()函数开始每次读取一个输入字符,它跳过空白字符(包含空格、制表符和换行符)直到遇到一个非空白字符,并期望发现一个数字字符或者一个符号(+或者-)。
如果发现一个数字或符号,那么就保存并读取下一个字符;如果接下来的字符是一个数字,再保存,继续读取。如此持续直到遇到一个非数字字符,此时函数认为:已经读到了整数的末尾。
scanf会将这个非数字字符放回输入缓冲区。这意味着:下一次程序开始读取输入时,仍将从这个非数字字符开始。如果使用多个%d读取整数,但是不小心在中间输入了非数字字符,那么除了非数字字符之前对应的变量外,后面的变量将不会被赋值。
也就是说如果遇到非数字字符,scanf("%d")是会自动忽略的,且认为读入已经结束了,如果是给数组赋值,非数字字符之后的空间其实都没有被成功赋值,如果数组定义在主函数外,那么空间最开始都是为0的,没有被赋值的空间仍然为0,但如果数组定义在主函数内,未被赋值的空间输出来也有值,只不过是一些不知道是什么的数字。

  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
格式化字符串漏洞是一种常见的安全漏洞,它通常发生在程序使用格式化字符串函数(如printf、sprintf等)时,没有正确地对参数进行检查,导致攻击者可以利用这个漏洞来执行任意代码或者读取敏感信息。 具体来说,当程序使用格式化字符串函数时,如果格式字符串中包含了%s、%d等格式控制字符,而对应的参数却没有进行正确的转换和检查,就可能导致漏洞的产生。攻击者可以通过在参数中插入特定的格式控制字符,来读取或者修改内存中的数据,从而实现攻击目的。 例如,下面的代码中,使用了sprintf函数来将一个用户名和密码拼接成一个HTTP请求,但是没有对用户名和密码进行检查: ``` char username[128]; char password[128]; char request[256]; // 从用户输入中获取用户名和密码 gets(username); gets(password); // 使用sprintf函数拼接HTTP请求 sprintf(request, "GET /login?username=%s&password=%s HTTP/1.1\r\n", username, password); ``` 攻击者可以通过输入一些特定的字符串来触发格式化字符串漏洞,例如输入“%x %x %x %x %x %x %x %x”,就可以读取内存中的数据并泄露敏感信息。 为了避免格式化字符串漏洞,程序需要正确地对格式化字符串函数的参数进行转换和检查,可以使用函数如snprintf、vsprintf等来代替不安全的sprintf函数,或者使用格式化字符串函数的安全版本,如printf_s、sprintf_s等。同时,还需要注意对输入数据进行正确的验证和过滤,以防止恶意输入触发漏洞。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值