[C / C ]得到() 和fget() 在C / C – 当用户得到警告() – 警告在使用时获得()
通常我们使用一个变量进入功能scanf函数(), 这个功能是用于输入 1 字符串但与空白符号会见 (空间, 进入,…) 那就不要再阅读,该字符串从切, 例如进入 “阮文机构” 那么我们只能得到 “阮”.
这里的解决方法是我们使用的功能得到() 进入字符串. 😀 Khi đó ta sẽ nhận được chuỗi nguyên vẹn.
但是出现了一个棘手的事情是,如果缓冲区 (标准输入文件) 其中包含的字符没有被读 (VD空白由scanf函数() 仍然无法读取该文件标准输入) 它得到() 正确接收信件,并没有输入字符串 (浮动命令的现象). 而我们在治疗前用得到() 加入 1 标准输入命令来删除fflush夜(标准输入). 然后,我们能够输入字符串 1 稳定
#include <stdio.h> int main() { int age; char name [256]; printf ("Insert your age: "); scanf("%d",&age); fflush(stdin); printf ("Insert your name: "); gets (name); printf ("Your name is: %s and you are %d years oldn",name, age); return 0; }
但是,问题再次出现在我们看不到的窗户 1 在代码中的警告, 天鹅绒虽然没有错误,但出现在Linux代码 2 问题. 首先,该机将编译警告 ” 警告: “字符*获得(字符*)“已过时 (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations] ” và thứ hai là lệnh fflush(标准输入) sẽ không có tác dụng, ta lại bị trôi lệnh.
Trước tiên ta đi xử lý cảnh báo này. Trong cuốn sách “Secure Programming Cookbook for C and C++” có một đoạn ở chương 3.1 có nói rằng: 得到() là một hàm nằm trong bộ thư viện cũ của C. 这个功能是用于输入链,但很舒服,但是有一个非常危险的点的缓冲区的大小不检查输入的数据. 这将使得程序崩溃或更糟,如果整个系统崩溃,如果输入超过声明或处理. 特别是在Linux上, 内存管理非常严密 (更多的窗口 !) 所以警告是完全正确, 没有新的警告是有问题 !
您可以通过在窗口编译程序试试. 在大多数情况下 (使用许多不同的编译器) 没有警告. 但在其他Linux, 因为它是唯一的机制,以确保系统的稳定性, 确保系统不被吃掉被流弹程序员 , 否则GCC编译器是免费的,但很现代,但, 它总是修复和最新标准的C / C 的更新
(评论 drnoxxx 在ddth.com)
那么该如何处理呢? 对于我们的一个解决方案是使用与fgets() 进入. 与fgets() 是一种功能,使我们能够从文件导入并输入链时指定的大小. 代码说明用于导入文件
#include <stdio.h> int main() { FILE * pFile; char mystring [100]; pFile = fopen ("myfile.txt" , "r"); if (pFile == NULL) perror ("Error opening file"); else { if ( fgets (mystring , 100 , pFile) != NULL ) //nhap chuoi toi da 100 phan tu tu file puts (mystring); fclose (pFile); } return 0; }
但是,如果你想使用与fgets达音科() 从键盘,明星进入? 很简单, 你不需要申报文件如上, 只需更换标准输入的文件是由好吗 !
fgets (mystring , 100 , stdin);
解决第一个问题 2 如果不使用fflush缓冲器被删除(标准输入) ? 答案很简单,只是从stdin读取所有空间 1 某些变量,并继续他的工作是好的.
但使用与fgets当另一个问题就出现了() 从键盘输入,当你完成输入的字符串必须按回车键,它会永远读你进入钥匙链, 当光标会自动换行, 当我们想要写这变得很困难 2 xuau相同 1 当前. 解决这一问题,我们使用的另一种技术,增加了一个NULL分配给香蕉的最后一个字符输入命令
string[strlen(string)-1] = '\0'; //chu ý khai báo string.h
下面是所用的代码与fgets().
#include <stdio.h> #include <string.h> int main() { int age; char name [256]; printf ("Insert your age: "); scanf("%d",&age); if (fgets (name,256,stdin) != NULL); //xoa bo dem //fflush(stdin); //khong co tac dung xoa bo dem printf ("Insert your name: "); if (fgets (name,256,stdin) != NULL); //nhap ten name[strlen(name)-1] = '\0'; printf ("Your name is: %s and you are %d years oldn",name, age); return 0; }
“\0’ 你是什么感觉.
那是你最终字符的字符串
亲爱的朋友们, 问问自己这种情况. 如果输入与各值的线条文件,并用空格隔开. 例如,: 2 3 4 6 在同一行,我想读的价值 2, 3, 4, 6 并写入到一个数组,那么如何去除你诶其他空间
谢谢更多
你只需要使用的fscanf是.
我的朋友, tại sao câu lệnh if (与fgets (名字,256,标准输入) != NULL); lại có tác dụng xóa bộ nhớ đệm
Vì nó đọc chuỗi trong bộ nhớ đệm mà 🙂
sao e ghi vào ‘\0’ máy báo lỗ ạ
A được rồi a ơi
loi gi the e.
anh ơi sao em chạy chương trình trên của anh nó thông báo như này
1.Ç: In function ‘main’:
1.Ç:13:28: 警告: character constant too long for its type [默认情况下启用]
名字[strlen的(名字)-1] = ‘\0“;
^
1.Ç:13:5: 警告: overflow in implicit constant conversion [-Woverflow]
名字[strlen的(名字)-1] = ‘\0“;
^
Nó chỉ là cảnh báo thôi. 没关系.
Còn get_s như thế nào so với fget hỏi anh?
get_s nó giống gets, chẳng qua là do từng phiên bản thôi. fget从文件中读取NHE. http://en.cppreference.com/w/c/io/gets
在语法与fgets ( 坦克 *, INT , 文件 *) , 但它在性质上是有限的INT. 应该始终有进入一个更大的数字字符串应该阅读.
例: 1234他们, 必须放置更大INT 7. 如果 2 或 3 那么读缺失.
老师不知道如何进入数字为int和仍然可以运行权…!!
刚进入 255 是. 它定义了必须包含在中断函数参数.
晚报..!!
^^
让我问为什么报
名字[strlen的(名字)-1] = ‘\0“;; 是
character constant too long for its type
您会看到‘ 0’ 的确,没有撇号?
服务员, 我的代码删除 1 下面的文件中的行, 同时采用循环与fgets但我不明白这一点, 帮助孩子的愿望来运行!
https://drive.google.com/open?id=1BUkChJCUK6k9Wiq7Pq0e4amzAHW3vzs_
不明白是什么, 任何不理解的部分, 命令. 请问谁知道怎么解释如何? 链接无法访问NHE.
的, 期待他同情, 我不明白while循环迭代的条件, 如何才能浏览功能与fgets的行和列?
https://drive.google.com/open?id=1PjJ1nMjL6tctCATTVlN0Ksd29oWLtQVf
与fgets读 1 链 (在这里可以看作是 1 当前).
而( 与fgets(海峡, 199, 结束) != NULL) 平均一会儿,然后继续阅读.
嗯,这意味着fgets读取的字符是' n’ 然后循环再次先生?
Ë花视觉 2017, 函数getline命令获取花费所有故障é没有发现与scanf函数printf命令未知dinh.Va添加 ” _s ” 它不是一个错误的背后, E要在这里做, 也许不是错误的软件.
柯NHE. 因为它的VS. 这里使用开发-C代码++, VS罐命令结构是有点不同的.
如果使用gets_s,则可以使用以下语法
gets_s(,
);5 这篇文章的明星, 我已修复错误. 非常感谢