【已解决】我又来求助了!
Tofloor
poster avatar
zwq133
deepin
2018-09-04 06:23
Author
本帖最后由 zwq133 于 2018-9-4 08:45 编辑

在网上拔了一段验证ip地址的代码,原文用的是gest(fgets函数,在编译的时候会产生一个警告,强迫症表示受不了这玩意。
于是就把gest换成了fgest(fgets,然而,问题来了,执行循环里的代码就出问题了,看图 ↓




↓ 这是用了fgest(fgets函数的效果 ↓

Reply Favorite View the author
All Replies
avatar
老陌
deepin
2018-09-04 06:59
#1
哈哈,我正在学习第一章,目前还看不懂。等我能看懂了,再帮助你,先来捧个人场。
Reply View the author
avatar
Deepin大法好
deepin
2018-09-04 16:30
#2
哈哈,是fgets不是fgest哟。
问题在于,fgets在读取一行的时候,如果字符数小于最大长度,则会在结束符之前添加换行符,这也就是为什么你调试输出的时候有两个\n
解决方法是,检查str中是否有\n,如果有则替换为\0,使字符串提前结束
char len = 0;
while (fgets(str, 16, stdin) != NULL) {
    len = strlen(str);  // 字符串实际长度
    if (str[len - 1] == '\n') // 如果结束符前最后一位为换行符
        str[len - 1] = '\0'; // 则替换为结束符
    ..........
}
Reply View the author
avatar
zwq133
deepin
2018-09-04 16:42
#3
https://bbs.deepin.org/post/168416
哈哈,是fgets不是fgest哟。
问题在于,fgets在读取一行的时候,如果字符数小于最大长度,则会在结束符之前 ...

哦!不好意思,手滑写错了!!
感谢,用你的方法完美解决!
还有就是 while (fgets(str, 16, stdin) != NULL) 里面的“!= NULL”是多余的,复制上面语句的时候忘删了,最后发现有它没他都一个样。因为条件本身就成立!
Reply View the author
avatar
187******69
deepin
2018-09-04 19:10
#4
牛人啊。
Reply View the author