[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áchSecure 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] = '&#092;&#048;'; //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] = '&#092;&#048;';
	printf ("Your name is: %s and you are %d years oldn",name, age);
	return 0;
}