当前位置: 首页 > news >正文

兰州网站seo技术厂家济宁网站建设 田振

兰州网站seo技术厂家,济宁网站建设 田振,wordpress用户登录地址,外贸手工做兼职的网站getline() 提供了一种更灵活的方法#xff0c;可以在不破坏系统的情况下将用户数据读入程序。 在 C 语言中读取字符串是一件非常危险的事情。当读取用户输入时#xff0c;程序员可能会尝试使用 C 标准库中的 gets 函数。它的用法非常简单#xff1a; char *gets(char *stri… getline() 提供了一种更灵活的方法可以在不破坏系统的情况下将用户数据读入程序。 在 C 语言中读取字符串是一件非常危险的事情。当读取用户输入时程序员可能会尝试使用 C 标准库中的 gets 函数。它的用法非常简单 char *gets(char *string); gets() 从标准输入读取数据然后将结果存储在一个字符串变量中。它会返回一个指向字符串的指针如果没有读取到内容返回 NULL 值。 举一个简单的例子我们可能会问用户一个问题然后将结果读入字符串中 #include stdio.h #include string.h int main() {char city[10]; // 例如 Chicago// 这种方法很糟糕 .. 不要使用 getsputs(Where do you live?);gets(city);printf(%s is length %ld\n, city, strlen(city));return 0; } 输入一个相对较短的值就可以 Where do you live? Chicago Chicago is length 7 然而gets() 函数非常简单它会天真地读取数据直到它认为用户完成为止。但是它不会检查字符串是否足够容纳用户的输入。输入一个非常长的值会导致gets()存储的数据超出字符串变量长度从而导致覆盖其他部分内存。 Where do you live? Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch is length 58 Segmentation fault (core dumped) 最好的情况是覆盖部分只会破坏程序。最坏的情况是这会引入一个严重的安全漏洞恶意用户可以通过你的程序将任意数据插入计算机的内存中。 这就是为什么在程序中使用 gets() 函数是危险的。使用 gets() 你无法控制程序尝试从用户读取多少数据这通常会导致缓冲区溢出。 安全的方法 fgets() 函数历来是安全读取字符串的推荐方法。此版本的 gets() 提供了一个安全检查通过仅读取作为函数参数传递的特定数量的字符 char *fgets(char *string, int size, FILE *stream); fgets() 函数会从文件指针读取数据然后将数据存储到字符串变量中但最多只能达到 size 指定的长度。我们可以更新示例程序来测试这一点使用 fgets() 而不是  gets()  #include stdio.h #include string.h int main() {char city[10]; // 例如 Chicagoputs(Where do you live?);// fgets 虽好但是并不完美fgets(city, 10, stdin);printf(%s is length %ld\n, city, strlen(city));return 0; } 如果编译运行你可以在提示符后输入任意长的城市名称。但是程序只会读取 size  10 数据存储到字符串变量中。因为 C 语言在字符串末尾会添加一个空\0字符这意味着 fgets() 只会读取 9 个字符到字符串中。 Where do you live? Minneapolis Minneapol is length 9 虽然这肯定比 fgets() 读取用户输入更安全但代价是如果用户输入过长它会“切断”用户输入。 新的安全方法 更灵活的解决方案是如果用户输入的数据比变量可能容纳的数据多则允许字符串读取函数为字符串分配更多内存。根据需要调整字符串变量大小确保程序始终有足够的空间来存储用户输入。 getline() 函数正是这样。它从输入流读取输入例如键盘或文件然后将数据存储在字符串变量中。但与fgets() 和 gets() 不同getline()使用 realloc() 调整字符串大小确保有足够的内存来存储完整输入。 ssize_t getline(char **pstring, size_t *size, FILE *stream); getline()实际上是一个名为 getline()的类似函数的装饰器它会读取数据一直到特殊分隔符停止。本例中getline() 使用换行符\n作为分隔符因为当从键盘或文件读取用户输入时数据行由换行符分隔。 结果证明这是一种更安全的方法读取任意数据一次一行。要使用 getline()首先定义一个字符串指针并将其设置为 NULL 表示还没有预留内存再定义一个 size_t 类型的“字符串大小” 的变量并给它一个零值。当你调用 getline()时你需要传入字符串和字符串大小变量的指针以及从何处读取数据。对于示例程序我们可以从标准输入中读取 #include stdio.h #include stdlib.h #include string.h int main() {char *string NULL;size_t size 0;ssize_t chars_read;// 使用 getline 读取长字符串puts(Enter a really long string:);chars_read getline(string, size, stdin);printf(getline returned %ld\n, chars_read);// 检查错误if (chars_read 0) {puts(couldnt read the input);free(string);return 1;}// 打印字符串printf(%s is length %ld\n, string, strlen(string));// 释放字符串使用的内存free(string);return 0; } 使用getline()读取数据时它将根据需要自动为字符串变量重新分配内存。当函数读取一行的所有数据时它通过指针更新字符串的大小并返回读取的字符数包括分隔符。 Enter a really long string: Supercalifragilisticexpialidocious getline returned 35 Supercalifragilisticexpialidociousis length 35 注意字符串包含分隔符。对于 getline()分隔符是换行符这就是为什么输出中有换行符的原因。 如果你不想在字符串值中使用分隔符可以使用另一个函数将字符串中的分隔符更改为空字符。 通过 getline()程序员可以安全地避免 C 编程的一个常见陷阱你永远无法知道用户可能会输入哪些数据。这就是为什么使用 gets() 不安全而fgets() 又太笨拙的原因。相反getline()提供了一种更灵活的方法可以在不破坏系统的情况下将用户数据读入程序。
http://www.zqtcl.cn/news/925263/

相关文章:

  • 商城类的网站一般怎么做做ps从哪个网站上下载图片大小
  • 怎么做网站链接支付免费推广网站搭建
  • 威海 网站建设刚刚北京传来重大消息
  • 深圳返利网站开发做网站版权怎么写
  • 上传网站内容做社交电商第一步怎么做
  • 网站icp查询系统wordpress 页面 首页
  • wordpress安装教程wamp搜索引擎优化的英文缩写是什么
  • 成都旅行社网站建设网站建设包含哪些方面
  • 找不到网站后台怎么办韩国网站域名分类
  • 建设商务网站作用积极参与网站信息建设工作
  • 网站开发阶段Oss怎么做静态网站
  • 做科学小制作的视频网站怎么才能建立自己的网站啊
  • 跳蚤市场网站开发背景网站优点
  • 长春网站建设方案咨询怎么做自己的网站平台
  • 网站建设谈单技巧做网站建设科技公司
  • 品牌网站建设4a小蝌蚪网页设计分类
  • 域名注册以后会给你一个账户名密码上传做好的网站文化网站建设需要的功能
  • 企业站用wordpress做好吗那些做环保网站的好
  • 天津有哪些有名的网站建设公司商城网站模板免费
  • 安徽省途顺建设工程有限公司网站制作网站公
  • 北京建设职工大学网站成都网站建设比较好的公司
  • 网站建设品牌策wordpress怎么做企业网站
  • 网站正在建设中 html 模板医院网站建设预算表
  • 哪个网站能接施工图来做购物网站黑白
  • 网站开发课设心得企业宣传页模板
  • 中学生怎么做网站ghost 卸载wordpress
  • 网站诊断报告案例用户浏览网站的方式
  • 网站开发流程抚州做网站需要看的书
  • wordpress 禁止目录浏览网站seo推广优化
  • 源代码如何做网站高校门户网站建设需要多少钱